我正在定义一个正则表达式如下:
regex = new Regex(@"^\(([^()]+)\)", RegexOptions.Multiline);
这对于处理这样的内容非常有用:
abc
123
(xyz)
some things
(more of the other)
并返回第1组匹配:
xyz
more of the other
然而,当它遇到这样的文字时:
abc
123
(xyz)
some things
(111 \(look at this\) 999)
(more of the other)
我希望它匹配
xyz
111 \(look at this\) 999
more of the other
但我无法弄清楚如何修改字符类[^()]
以指示在使用前面的“\”进行转义时可以接受括号。我试过了:
^\((([^()]|\\\(|\\\))+)\)
但是第1组的匹配是:
xyz
111 \(look at this\
more of the other
注意第二场比赛中缺少右括号。
编辑:我忘了提到括号组后面可能有文字,不应该被捕获,例如:
(more of the other) TB ff
应该只捕获
more of the other
答案 0 :(得分:2)
您需要从字符类中排除反斜杠,否则第二个和第三个分支将首先与转义字符不匹配。要允许其他字符也被转义,您需要用圆点替换括号:
\(((?>(?:[^()\\]|\\.)+))\)
您也可以这样写(效率更高):
\(((?>[^()\\]*(?:\\.[^()\\]*)*))\)
答案 1 :(得分:1)
为什么不保持简单?
^\((.+)\)$
如果它们定义了行的开头和结尾,则匹配(
和)
之间的所有内容。
示例:Analyzing Source Code - SonarQube-5.3
别忘了设置多线模式。
输入:
(111 \(look at this\) 999)
(more of the other)
abc
123
(xyz)
some things
结果:
Match 1
Full match 0-26 `(111 \(look at this\) 999)`
Group 1. 1-25 `111 \(look at this\) 999`
Match 2
Full match 27-46 `(more of the other)`
Group 1. 28-45 `more of the other`
Match 3
Full match 55-60 `(xyz)`
Group 1. 56-59 `xyz`