在多个匹配中访问命名的正则表达式捕获组

时间:2012-12-13 19:35:53

标签: .net regex vb.net

我有一行文字,可能包含一个或多个匹配项。我正在使用命名捕获组,因为我不断改变它,这使它变得更容易。

字符串:

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”捕获组的内容

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

1 个答案:

答案 0 :(得分: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*!