1

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

图案:

"abc\(.*?\)abc"

文本:

"abc(" "")abc"

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

图案:

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

文本:

"def(" "")def"

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

4

2 回答 2

2

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

"(.*?)\(.*?\)\1"
于 2013-08-15T09:24:02.297 回答
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

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

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

Online .NET regex demo                                                                                         For further reading >>>

于 2013-08-15T09:42:43.823 回答