使用此模式,我可以匹配此文本
图案:
"abc\(.*?\)abc"
文本:
"abc(" "")abc"
如果我希望用户决定如何开始和结束它怎么办。而不是 abc 它可以是任何东西
图案:
"(.*?)\(.*?\)$1"
文本:
"def(" "")def"
除非这不起作用,因为它似乎 $ 表示行尾并且与第 1 组不匹配。是否可以在 .NET 中使用正则表达式匹配我想要的方式?
您需要\1
在正则表达式模式中使用来反向引用捕获组:
"(.*?)\(.*?\)\1"
我主要$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
为了将来参考,我们还可以使用命名组。您可以使用以下语法在 .NET 中声明命名组(?<namedgroup>.*?)
。然后,您可以\k<namedgroup>
在表达式中使用如下反向引用。请记住,此语法仅适用于 .NET。PCRE 有另一种语法。
以我们上面的表达式为例,将导致以下模式:(?<quotes>"|')(?<str>.*?)\([^)]+\)\k<str>\k<quotes>