ページ 11

C# 正規表現について

Posted: 2016年3月03日(木) 10:37
by ソース勉強中
こんにちは、ただいまC#の正規表現機能について勉強しております。
C#のソースの中で散らばっている記述を解析するプログラムを正規表現機能を利用して書いております。
その中でいくつかわからないことがでてきました。

".+[^-~。-゜^\r\n^\t]"
この記述で””で囲まれている全角文字列を検出できるのですが
MessageBox.show("テキスト","タイトル"); → テキスト","タイトル
のように1行に複数のダブルコーテーションがある場合はつながって出てきてしまいます。
これを分離するためにはどうすればよいでしょうか。

/^(?!.*//).$/m

この記述でコメント行 // が除外できると思うのですが、
「+=」 (?=\+\=) といった特定の文字列を含む行を検索する際にどう記述すればよいかわかりません。
このような場合はどうすればよいでしょうか。

Re: C# 正規表現について

Posted: 2016年3月03日(木) 11:23
by YuO
ソース勉強中 さんが書きました:C#のソースの中で散らばっている記述を解析するプログラムを正規表現機能を利用して書いております。
参照) .NET Compiler Platform (a.k.a. Roslyn)
コンパイラの構文解析結果等を利用することができるようです。
ソース勉強中 さんが書きました:".+[^-~。-゜^\r\n^\t]"
この記述で””で囲まれている全角文字列を検出できるのですが
MessageBox.show("テキスト","タイトル"); → テキスト","タイトル
のように1行に複数のダブルコーテーションがある場合はつながって出てきてしまいます。
これを分離するためにはどうすればよいでしょうか。
まず,「全角文字列」とやらをきっちりと定義してください。
そして,正規表現を読むと,
  1. U+0022
  2. 1文字以上の任意文字列
  3. U+FF3EからU+FF5E,U+3002からU+309C,U+005E,U+000D,U+000A,U+0009
  4. U+0022
という文字列にマッチします。
なので,恐らく想定しているものと異なるのではないかと思います。
オフトピック
文字は正しく使ってください。
U+0022 (QUOTATION MARK) と U+201D (RIGHT DOUBLE QUOTATION MARK) は別物なので,上記正規表現からU+201D U+201Dで囲まれた文字列は絶対にマッチしません。
ソース勉強中 さんが書きました:/^(?!.*//).$/m
この記述でコメント行 // が除外できると思うのですが、
「+=」 (?=\+\=) といった特定の文字列を含む行を検索する際にどう記述すればよいかわかりません。
このような場合はどうすればよいでしょうか。
なんかややこしいことを書いていますが……。

コード:

^.*//.*$
とか

コード:

^.*\+=.*$
とかでよいと思うのですが,これでは問題なのでしょうか。
オフトピック
前提はFile.ReadAllLines等で一気に行分割して読み込んで,Enumeralbe.Whereの中でRegex.IsMatchで判定。
除外するならIsMatchしなかった ( s => !Regex.IsMatch(s, regex) ) ものだけを残せばよい

Re: C# 正規表現について

Posted: 2016年3月03日(木) 19:20
by ソース勉強中
返信ありがとうございます。

なるほど。解析ツールもあるのですね。参考にさせていただきます。
アドバイスの件で作業が進みそうです。後は自力でやってみます。