在模式中使用捕获?

时间:2013-08-15 09:21:53

标签: .net regex

使用此模式,我可以匹配此文本

百通:

"abc\(.*?\)abc"

文本:

"abc(" "")abc"

如果我希望用户决定如何开始和结束它,该怎么办?而不是abc它可以是任何东西

模式:

"(.*?)\(.*?\)$1"

文本:

"def(" "")def"

除非这不起作用,因为它显示$表示行尾并且与组1不匹配。是否可以在.NET中使用正则表达式匹配我想要的方式?

2 个答案:

答案 0 :(得分:2)

您需要在正则表达式模式中使用\1来反向引用捕获组:

"(.*?)\(.*?\)\1"

答案 1 :(得分:2)

我大多看到替换部分中使用的$1。但是在表达式中它不起作用,您必须使用\1,因此您的表达式应如下所示:"(.*?)\(.*?\)$1"

让我们改进一下。我们可以使用负字符类明确匹配:\([^)]+\)[^)]+表示除了右括号之外的任何内容匹配一次或多次。这样我们也消除了空括号。

现在让我们应用我们刚刚学到的东西,并使表达式也接受单引号:("|')(.*?)\([^)]+\)\2\1

("|')   # match either a single or double quote and put it in group 1
(.*?)   # match anything ungreedy zero or more times until ... and put it in group 2
\(      # match opening parenthesis (
[^)]+   # match anything except closing parenthesis ) one or more times
\)      # match closing parenthesis
\2      # match what was matched in group 2
\1      # match what was matched in group 1

为了将来参考,我们还可以使用命名组。您可以使用以下语法(?<namedgroup>.*?)在.NET中声明命名组。然后,您可以在表达式中使用类似以下\k<namedgroup>的反向引用。 请记住此语法仅适用于.NET 。 PCRE有另一种语法。

以上面的表达为例,将产生以下模式:
(?<quotes>"|')(?<str>.*?)\([^)]+\)\k<str>\k<quotes>

Online .NET regex demo For further reading >>>