2

中かっこ ' ' が続かないすべてのifステートメントとステートメントを検索したいと考えています。ステートメントに 1 行を記述する場合、中括弧で囲むことはほとんどないので、それらとステートメントをすべて見つけたいと思います。for{ififfor

助けてください!

このステートメントをキャプチャしたいように

if (childNode.Name == "B")
    return TokenType.Bold;

しかし、これらの種類ではありません

if (childNode.Name == "B")
{
    return TokenType.Bold;
}

正規表現でやりたいです。

4

3 に答える 3

7

基礎となる数学では完全な一致は認められないため、「 ' if' をすべて検索し、その後にセミコロンを付けて中括弧を挟まない」などの適切なヒューリスティックを使用できます。

/\<if\>[^{]*;/

ここで\<、 と\>は、正規表現の方言に応じて、単語の始まりと単語の終わりです。また、入力内のすべての改行を無視するように注意してください。一部の正規表現プロセッサには、そうするように指示する必要があります。


StyleCopも参照してください。これは、ソース コードに対してさまざまなチェックの大きなセットを実行するツールです。このチェックはすでにあります。

于 2009-01-13T06:48:42.180 に答える
4

100% 機能するソリューションが必要な場合は、正規表現は当てはまりません。実際のコードで正規表現をつまずかせるのはあまりにも簡単です。たとえば、次の正規表現を取ります

"^\s*if\W[^{]*\n\s*[^{]"

これは、中括弧で囲まれていない「if」ステートメントの大部分に一致します。ただし、簡単に壊れます。以下のサンプルを取ります。正規表現は、中かっこを含むステートメントのように、これらに誤ってフラグを立てます。

例 1

if ( SomeFunction(() => { return 42; }) ) 

例 2

/* Big comment
   if ( true ) {
*/

リストは延々と続きます。

要するに、完璧が必要な場合、正規表現は機能しません。完全ではない解決策に満足している場合は、上記の正規表現でうまくいくはずです。

于 2009-01-13T07:23:43.683 に答える
0

求めている純粋な正規表現を記述できない理由を見つけるために、Finite-State Machine を Google で検索できます。

一方、一部の正規表現インタープリターは、Perl 言語のように、以前に一致した式を参照する可能性があり、理論的には C# 文法全体を実装することができます。ただし、この考えには従わないでください ;) David Schmitt の考えは素晴らしいです。

于 2009-05-25T10:03:57.910 に答える