0

次の正規表現パターンを使用して、C# スタイルで記述された if ステートメントに一致させています。

\b[if]{2}\b[ ]?\({1}(?<HeaderSection>[ \w\s\a\t\=\.\@\#\$\%\&a-zA-Z0-9\(\)\;\/\"\'\[\]\*]*)\){1}(?<CommentSection>[\s\a\w\t a-zA-Z0-9\/\.]*)[\r\n]*\{{1}(?<FunctionBody>[\r\n \a\s\wa-zA-Z0-9\(\)\"\.\;\:]*)[\r\n]*\}{1}

その非常に長い正規表現パターンですが、ある程度機能しているようです.説明させてください.3つの名前付きキャプチャグループ、つまりHeaderSectionCommentSection、およびFunctionBodyがあります。下;

if(Value1==Function(int Z))

キャプチャします。

Value1==Function(int Z)

同様に、CommentSection は閉じ括弧の後にコメント (存在する場合) をキャプチャするため、以下のステートメントから;

if(Value1==Function(int Z))//This is a Comment.

それはキャプチャします

//This is a Comment.

FunctionBody は、以下のコードのように { と } の間のすべてをキャプチャします。

if(Value1==Function(int Z))//This is a Comment.
{
  This is the
  space for
  function body.
}

「これは関数本体のスペースです」をキャプチャします。これが、正規表現が一致するものの説明でした。今の問題は、私がこのような関数を持っている場合です。

if(Value1==Function(int Z)//This is a Comment.
{
  if(Value2==Value1)
  {
    Some code
  }
}

上記の正規表現を使用して一致させると、最初の if 宣言と一致しません。

if(Value1==Function(int Z)//This is a Comment.
{
Another function();
}

代わりに内側のものと一致します

  if(Value2==Value1)
  {
    Some code
  }

私が間違ったことを指摘してください。または、それほど面倒ではない別の方法がある場合はお知らせください。または、どこかで間違っている場合は正規表現パターンを修正してください。前もって感謝します。

4

1 に答える 1

1
(?<header>if\(.*?)(?<comment>//.*?)*\s\n\{(?<functionbody>.*?)\n\}

パランが想定どおりにフォーマットされている場合、これは解決策のようです。

(?<header>if\(.*?)

セクションif(の前に何かが続くと一致するため、一致します//

if(Value1==Function(int Z))

次に(?<comment>//.*?)*\s、記号に続くすべてのものに一致する に移動しますが、ゼロ以上の出現に等しい//ものがない場合にも一致し、行末を超えないようにします。*\s

次に、改行の直後の(\n\{)(?<functionbody>.*?)(\n\})any に一致し、改行の直後に a が見つかる{まで進みます。}

var x = 0
if(Value1==Function(int Z))//This is a Comment.
{
  if(Value2==Value1)
  {
    Some code
  }
}
var y = 0

if(y == x) 
{
    x = y + 1
}

次のグループに一致します。

header: if(Value1==Function(int Z))
comment: //This is a Comment.
functionbody: 
  if(Value2==Value1)
  {
    Some code
  }

header: if(y == x) 
functionbody: 
        x = y + 1
于 2013-10-07T15:49:11.260 に答える