我有一行文字,可能包含一个或多个匹配项。我正在使用命名捕获组,因为我不断改变它,这使它变得更容易。
字符串:
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”捕获组的内容。
有人能告诉我一个如何做到这一点的简单例子吗?
答案 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*!