C#で、構文解析するコードを作っています。
その際、複数の半角スペースをタブに置換したいのですが、うまくいきません。
自分ではどこを疑っていいやら検討も付かないので、分かる方いらっしゃいましたら教えていただけませんか。
(ファイル読み込み部分も関係あるかもしれないと思い、コードを貼り付けました。。。)
その他、不明点などありましたら、お手数ですが、レスでご指摘ください。
■やりたいこと
プログラムファイルを読み込み、構文解析する。
(構文解析するために、事前準備として、演算子や変数名を単語分割するために、\tで区切る。)
■問題
複数の半角スペース(正規表現)から、タブ(\t)の置換ができない。
strConvert = strConvert.Replace(@" +", "\t");
■コード↓
※下記コードだけでは動きません。親関数&構造体が未掲載です。
/************************************************************/
/* 関数 :bReadCodeFile */
/* 概要 :コードを読み出し、内部保持する。 */
/* 引数 :strFilePath :チェック対象コードのパス */
/************************************************************/
private void vbReadCodeFile(string strFilePath)
{
Boolean ret = false;
string strLine;
/* 読み出しファイル情報の初期化 */
uint u4_line_num = 0;
/* ファイルからテキストを読み出し。 */
using (StreamReader r = new StreamReader(@strFilePath,System.Text.Encoding.GetEncoding("shift_jis")))
{
strLine = r.ReadLine();
while (strLine != null) {
/* 行カウント */
u4_line_num++;
/* 配列の追加 */
Array.Resize(ref code_data, (int)u4_line_num);
/* インスタンス作成 */
code_data[u4_line_num - 1] = new CODE_DATA();
/* 読み出したデータを格納 */
code_data[u4_line_num-1].strRawString = strLine;
/* 次の行を読み出し */
strLine = r.ReadLine();
}
r.Close();
}
}
/*********************************************/
/* 関数 :vdDivideWord */
/* 概要 :単語分割する。 */
/*********************************************/
private void vdDivideSentenceWord()
{
uint u4Cnt = 0; /* 読み出し行(0始まり) */
string strSentence; /* 読み出し文字列 */
string strConvert; /* 読み出し文字列の変換用 */
uint u4ValidCodeCnt = 0;
uint u4WordCnt = 0;
for (u4Cnt = 0; u4Cnt < code_data.Length; u4Cnt++)
{
strSentence = code_data[u4Cnt].strRawString;
code_data[u4Cnt].strWord = new String[1]; /* 1データの領域を確保 */
strConvert = strSentence.Replace("\t", " ");
strConvert = strConvert.TrimStart(); /* 先頭に連続する空白の文字を削除 */
strConvert = strConvert.TrimEnd(); /* 先頭に連続する空白の文字を削除 */
/* コードの場合、有効行の構造体に登録 */
u4ValidCodeCnt++;
Array.Resize(ref valid_code, (int)u4ValidCodeCnt); /* 配列の追加 */
valid_code[u4ValidCodeCnt - 1] = new VALID_CODE_DATA(); /* インスタンス作成 */
valid_code[u4ValidCodeCnt - 1].objCodeData = code_data[u4Cnt];
/* 単語と記号の分割 */
/* =を含む比較演算子(!= <= >= ==)*/
strConvert = strConvert.Replace(@"([\!\<\>\=]\=)", " $1 ");
/* =を含む算出演算子(+= -= *= /= %= =)*/
strConvert = strConvert.Replace(@"([\+\-\*\/\%]{0,1}\=)", " $1 ");
/* 重ねるもの、かつ、=を含まないもの(ビット&算出&比較演算子)*/
/* (< > + - * / & | %) */
strConvert = strConvert.Replace(@"((\<{1,2}|\>{1,2}|\+{1,2}|\-{1,2}|\*{1,2}|\/{1,2}|\&{1,2}|\|{1,2}|\%{1,2})(?!\=))", " $1 ");
/* 単語と「;」の分離 */
strConvert = strConvert.Replace(";", " ;");
/* (↓ここができない)スペースをタブに置換 */
strConvert = strConvert.Replace(@" +", "\t");
/* 末尾の改行削除 */
strConvert = strConvert.Replace("\n", "");
u4WordCnt = (uint)(strConvert.Length - (strConvert.Replace(@"\t".ToString(), "").Length)) + 1; /* 単語数の取得 */
if (u4WordCnt > 1)
{
Array.Resize(ref code_data[u4Cnt].strWord, (int)u4WordCnt); /* 配列の確保 */
}
code_data[u4Cnt].strWord = strConvert.Split('\t'); /* 単語分割(区切り文字:タブ) */
}
}
■使用しているソフト
Microsoft Visual C# 2010
お礼
他の処理もできたり、できなかったりしてたので、「?」と思っていましたが、正規表現ができていなかったんですね。 回答ありがとうございます。解決しました。