0

このような関数のリストから関数全体をキャプチャするために、.NET で正規表現を作成しようとしています。

public string Test1()
{
    string result = null;
    foreach(var item in Entity.EntityProperties)
    {
        result +=string.Format("inner string with bracket{0}", "test");
    }
    return result;
}
public string Test5()
{
    return string.Format("inner string with bracket{0}", "test");
}

public string Last()
{
    return string.Format("inner string with bracket{0}", "test");
}

だから私は得た

((?<function>public string (?<fName>\w+)\(\)\s*{.*?})(?=\s*public string))

これにより、最後の関数を除くすべてがキャプチャされます...またはこれ

((?<function>public string (?<fName>\w+)\(\)\s*{.*?})(?=\s*(public string)|$))

これにより、最初の関数を除くすべての関数が正しく一致します。最初の関数は部分的にしか一致しません。

public string Test1()
{
    string result = null;
    foreach(var item in Entity.EntityProperties)
    {
        result +=string.Format("inner string with bracket{0}", "test");
    } <-- the first capture only get to this point.

何か案が?可能であれば、いくつかの説明を提供してください。

4

2 に答える 2

1

私は正規表現が大好きですが、ネストされた構造は「正規」ではないため、正規表現と一致しないため、あなたの場合は機能しません。この種の仕事にはパーサーが必要です。ごめん。

于 2009-11-24T21:36:06.380 に答える
1

一致するブラケットをチェックするために.NETでそれを行うことは実際には可能です。重要なのは、バランス グループを使用することです。以前から聞いていたので質問させていただきます。自分で式を書く方法がわからなかったので、レジデントの専門家の何人かが私を助けてくれることを望んでいました:)

幸いなことに、このウェブサイトを見つけました。バランシンググループを詳細に説明しています...彼はテンプレートも提供しています. ですから、ここに他のすべての人が参照できるようにします。

http://blog.stevenlevithan.com/archives/balancing-groups パターンの要点はこちら

{
    (?>
        (?! { | } ) .
    |
        { (?<Depth>)
    |
        } (?<-Depth>)
    )*
    (?(Depth)(?!))
}

詳細な説明については、彼のブログをチェックしてください。

于 2009-12-17T19:28:29.240 に答える