1

我有一行文本,其中可能包含 1 个或多个匹配项。我正在使用命名捕获组,因为我不断地改变周围的事物,这使它更容易。

细绳:

blah blah blah dasf{{optionA:B4}}t estsdf{{optionB:B4}}sadf{{optionB:B4}}sadf13

图案:

(?<choice>\{\{(?<c>optionA|optionB):(?<d>[A-Z]\d{1,2})\}\})

我可以在网上找到的每个处理这种类型结构的示例都没有使用命名捕获组,而且我自己也无法将它拼凑在一起。

在我的示例场景中,有 3 个匹配项,对于每个匹配项,我希望能够访问“choice”、“c”和“d”捕获组的内容

有人可以告诉我一个如何做到这一点的简单例子吗?

4

1 回答 1

3

要在匹配后访问命名捕获组的内容,您需要使用正则表达式对象:

Dim RegexObj As New Regex("(?<quote>['""])(?<text>.*?)\k<quote>")
Result = RegexObj.Match(Subject).Groups("text").Value

现在Result将包含(?<text>...)捕获组的内容。

对于多个匹配,您可以遍历结果,调用.NextMatch()直到找到最后一个匹配:

Dim ResultList As StringCollection = New StringCollection()
Dim RegexObj As New Regex("(?<quote>['""])(?<text>.*?)\k<quote>")
Dim Result As Match = RegexObj.Match(Subject)
While MatchResult.Success
    ResultList.Add(Result.Groups("text").Value)
    Result = Result.NextMatch()
End While

问题的原始答案(关于反向引用,而不是捕获组):

有两种情况可以使用反向引用:

  • 要在同一个正则表达式中引用反向引用,请使用\k<groupname>.
  • 要在替换文本中插入与命名组匹配的文本,请使用${groupname}.

例如,

res = Regex.Replace(subject, "(?<quote>['""])(?<text>.*?)\k<quote>", "*${text}*")

将改变

This is a "quoted text" and 'so is this'!

进入

This is a *quoted text* and *so is this*!
于 2012-12-13T19:50:08.733 回答