如何在转义时捕获括号?

时间:2016-11-28 08:54:57

标签: c# regex

我正在定义一个正则表达式如下:

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

2 个答案:

答案 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`