为什么以下正则表达式匹配此文本?

时间:2012-07-26 00:19:34

标签: c# regex parsing

我有正则表达式:(?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不是一个选项,为什么它与之匹配?

2 个答案:

答案 0 :(得分:3)

问题是你使用的是一个匹配任何东西的点,包括紧密的方括号,空格和(在单行模式下)换行符:

\[.+?\]

你应该改用:

\[[^\]]+\]

说明:

\[     Match a literal open square bracket.
[^\]]  Match any character except a close square bracket.
+      One or more.
\]     Match a literal close square bracket.

答案 1 :(得分: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);
    }
}