【问题标题】:Accessing named regex capture groups in multiple matches在多个匹配项中访问命名的正则表达式捕获组
【发布时间】:2012-12-13 19:35:52
【问题描述】:

我有一行文本,其中可能包含 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' 捕获组的 content

谁能给我一个简单的例子来说明如何做到这一点?

【问题讨论】:

  • 你真的是指反向引用吗?还是抓拍?您想在正则表达式 还是在正则表达式执行 之后引用组?
  • 执行后,我基本上需要知道所有这些匹配的 .Value。
  • 好吧,这叫抓包。反向引用通常只指正则表达式内的内容,有时也指替换字符串内的内容(Tim Pietzker 在他的回答中显示的内容)

标签: .net regex vb.net


【解决方案1】:

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

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

现在Result 将包含(?&lt;text&gt;...) 捕获组的内容。

对于多个匹配,您可以遍历结果,调用.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&lt;groupname&gt;
  • 要在替换文本中插入与命名组匹配的文本,请使用${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*!

【讨论】:

  • 我明白你在说什么,但我不明白它如何回答我的问题,因为我不明白它如何允许我在 VB .NET 代码中访问这些值。
  • @se_dude:啊,对不起,我误会了。这样更好吗?
  • 就我所知。问题是我正在处理多个匹配项,每个匹配项都有 3 个命名组。非常感谢您的帮助!
  • 虽然代码存在一些问题,但它确实让我走上了正轨,所以非常感谢您抽出时间帮助我:) 我会给您投票,但不能还没投票。我之前使用的是 MatchCollections,这使事情变得非常复杂,而您的方法要容易得多,并且确实有效。还学到了一些新东西(StringCollection):)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 2010-12-03
相关资源
最近更新 更多