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