アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (1件)

stringのReplaceだから正規表現のつもりが正規表現の扱いになっていないのでは。



strConvert = strConvert.Replace(@" +", "\t");

これを

strConvert = System.Text.RegularExpressions.Regex.Replace(strConvert, @" +", "\t");

こうしたらできました。
この行以外も正規表現として処理されていないんじゃないかと思うのですが。
    • good
    • 0
この回答へのお礼

他の処理もできたり、できなかったりしてたので、「?」と思っていましたが、正規表現ができていなかったんですね。
回答ありがとうございます。解決しました。

お礼日時:2011/05/05 12:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!