
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
No.1ベストアンサー
- 回答日時:
stringのReplaceだから正規表現のつもりが正規表現の扱いになっていないのでは。
strConvert = strConvert.Replace(@" +", "\t");
これを
strConvert = System.Text.RegularExpressions.Regex.Replace(strConvert, @" +", "\t");
こうしたらできました。
この行以外も正規表現として処理されていないんじゃないかと思うのですが。
他の処理もできたり、できなかったりしてたので、「?」と思っていましたが、正規表現ができていなかったんですね。
回答ありがとうございます。解決しました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
c言語
-
略語の読み方について
-
MACで動く実行ファイルをWindow...
-
C言語 バッファについて。
-
Windows Formアプリからコンソ...
-
visual studio 2022でのC#プロ...
-
C言語の関数のextern宣言
-
プログラマー達は何故、プログ...
-
C#でTreeViewのCheckBoxのサイ...
-
Python、プログラミングについ...
-
Notepad++の関数リスト表示でC...
-
C言語について。
-
VisualStudioでC++クラスを追加...
-
Cのコンパイルでコメントアウト...
-
大量のデータを読み込んで表示...
-
コンソールアプリを作成するの...
-
C#でログファイルにファイルパ...
-
C言語 配列と関数の練習問題
-
Notepad++の関数リスト表示の変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
大量のデータを読み込んで表示...
-
c言語
-
gccを行ってもexeファイルが生...
-
visual studio 2022でのC#プロ...
-
【C言語】全角文字の配列を、全...
-
Windows Formアプリからコンソ...
-
VisualStudioでC++クラスを追加...
-
VisualStudio2022でC言語プログ...
-
プログラマー達は何故、プログ...
-
C++でデスクトップGUIアプリ開...
-
逆コンパイルと逆アセンブルの...
-
C言語について。
-
C#でTreeViewのCheckBoxのサイ...
-
C言語の関数のextern宣言
-
int16_t の _t は何?
-
C#でログファイルにファイルパ...
-
ディスプレイの解像度とマウス...
-
c言語でイベントフラグを使った...
-
C言語のことです。写真(見にく...
おすすめ情報