使用此模式,我可以匹配此文本
百通:
"abc\(.*?\)abc"
文本:
"abc(" "")abc"
如果我希望用户决定如何开始和结束它,该怎么办?而不是abc它可以是任何东西
模式:
"(.*?)\(.*?\)$1"
文本:
"def(" "")def"
除非这不起作用,因为它显示$表示行尾并且与组1不匹配。是否可以在.NET中使用正则表达式匹配我想要的方式?
答案 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>