2

私は正規表現を持っています: (?ms)(?<attribute>\[.+?\]|public|private|\s)+?class

そして私はテキストを持っています:

[attribute]
public int a;

[attribute C]
[attribute B]
public class Test{

}

投稿した正規表現が一致する理由を知りたい:

[attribute]
public int a;

[attribute C]
[attribute B]
public class

一致するはずだと思います:

[attribute C]
[attribute B]
public class

私が間違っている場合は修正してください。正規表現が読み取られるはずの方法は次のとおりだと思います。

属性 ( [ some attribute ] )、公開キーワード、非公開キーワード、またはスペースのいずれかを検索します。

したがって、最初に正規表現エンジンが [attribute] に一致し、次に '\n' (改行)、次にpublicキーワードに一致する必要があります。これらの後、キーワードintはオプションではないのに、なぜ一致するのでしょうか?

4

2 に答える 2

3

問題は、右角かっこ、空白、および (単一行モードの) 改行を含む、何にでも一致するドットを使用していることです。

\[.+?\]

代わりにこれを使用する必要があります。

\[[^\]]+\]

説明:

\[ リテラルの開き角括弧に一致します。
[^\]] 右角かっこ以外の任意の文字に一致します。
+ 1 つ以上。
\] リテラルの閉じ角括弧に一致します。
于 2012-07-26T00:24:27.557 に答える
1

これを使用してくださいRegex

((?<attribute>(?:public|private|\[[^\]]+\]))[\r\n\s]+)*class

。という名前のグループを指定しattributeます。コードは次のようになります。

foreach (Match match in Regex.Matches(inputString, @"((?<attribute>(?:public|private|\[[^\]]+\]))[\r\n\s]+)*class"))
{
    var attributes = new List<string>();
    foreach (Capture capture in match.Groups["attribute"].Captures)
    {
        attributes.Add(capture.Value);
    }
}
于 2012-07-26T00:44:23.867 に答える