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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Visual Basic(VBA) 配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。 2 2022/09/15 14:06
- Visual Basic(VBA) batにて、異なるフォルダの同名ファイルを参照し、文字列を判別。擬似配列で変数へ格納 3 2022/04/10 03:37
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
Linux Cプログラミングを学ぶた...
-
応用情報技術者試験の令和元年...
-
右ビットシフト
-
gccを行ってもexeファイルが生...
-
Notepad++の関数リスト表示の変...
-
c言語
-
これなにがちがうんですか??
-
インクリメント演算子のみを用...
-
VisualStudio2022でC言語プログ...
-
C言語 列挙型(enum型)変数について
-
どなたかこのプログラミングを...
-
大量のデータを読み込んで表示...
-
S-JIS → JIS コード変換するには
-
Windows formアプリで データグ...
-
ArduinoでMouse関数を使用して...
-
c言語
-
c言語
-
ArduinoのジャイロモジュールMP...
-
double型が正常に認識されてい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列と関数の練習問題
-
システムエンジニアの適正について
-
[C言語]fputsとfprintfの違い
-
C言語をコンパイルするとコンピ...
-
mallocについて
-
どちのほうがすきですか?
-
ArduinoのジャイロモジュールMP...
-
大量のデータを読み込んで表示...
-
gccを行ってもexeファイルが生...
-
VisualStudio2022でC言語プログ...
-
C言語 列挙型(enum型)変数について
-
こんなことてしますか??
-
C言語の関数と配列に関する質問
-
Linuxでの開発環境構築や設定の...
-
質問失礼します。 プログラム言...
-
MACで動く実行ファイルをWindow...
-
WindowsのCapsLock(キャップス...
-
これなにがちがうんですか??
-
卒業研究でよく分からないとこ...
-
gcc13.2のバグ?
おすすめ情報