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

问题是您使用的点匹配任何内容,包括右方括号、空格和(在单行模式下)换行符:

\[.+?\]

你应该改用这个:

\[[^\]]+\]

解释:

\[ 匹配文字左方括号。
[^\]] 匹配除右方括号之外的任何字符。
+ 一个或多个。
\] 匹配文字右方括号。
于 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 回答