【问题标题】:Identify which capturing group was matched in the evaluated string using regex使用正则表达式识别评估字符串中匹配的捕获组
【发布时间】:2021-09-20 04:31:19
【问题描述】:

你好,我是正则表达式的新手,我很难弄清楚如何使用 VBA 中的正则表达式来获取评估字符串中匹配的组。

它可以在字符串中出现 4 种或更多不同的单词可能性,后跟 1 位或更多位:

  • W 点 =
  • WR/KE-Point=
  • WNr 点=
  • SST_P-Nr =

其中一个词在字符串中只出现一次

求值字符串: "3: CALL U(Base,EZSP,Nr1,Pr-nr=20,Offset=1,Path=2,WNr-Point=20,Pr=65,ON)"

使用的正则表达式: (?:(W-Point=)(\d*)|(SST_P-Nr=)(\d*)|(WR/KE-Point=)(\d*)|(WNr-Point=)(\d *))

到目前为止一切正常:Example

问题:确定匹配的单词/数字对并获取其组号。现在我循环遍历结果并丢弃空的子匹配。有没有更好或更有效的方法?

提前致谢。

【问题讨论】:

  • 这对我来说似乎是一个 XY 问题。您要实现的最终目标是什么?你试过吗:(W-Point=|SST_P-Nr=|WR\/KE-Point=|WNr-Point=)(\d*)
  • 您所做的一切都会奏效。或者,使用文本函数,您可以提取匹配到= 符号的部分;然后查找位置。
  • 如果您的唯一目标是“识别匹配的单词/数字对并获取其组号”,并且如果数据太大并且生成的匹配数太多而无法循环,那么您可以一次简单地为每个组执行正则表达式,而不必使用循环再次识别该组。我的意思是说,如果您实际上不想要机器,而是想要每个组的匹配数,那么最好不要为每个组分别循环和执行正则表达式。
  • 感谢@cybernetic.nomad,这很有帮助,我只是想知道字符串中的哪个单词,以便我可以根据该单词对我的代码做一些其他的事情。

标签: excel regex vba conditional-statements capturing-group


【解决方案1】:

试试

Sub test()

    Dim s As String
    s = "3: CALL U(Base,EZSP,Nr1,Pr-nr=20,Offset=1,Path=2,WNr-Point=20,Pr=65,ON)"
    
    Dim Regex As Object, m As Object
    Set Regex = CreateObject("vbscript.regexp")
    With Regex
      .Global = True
      .MultiLine = False
      .IgnoreCase = True
      .pattern = "(W-Point|WR/KE-Point|WNr-Point|SST_P-Nr)( *= *)(\d*)"
    End With

    If Regex.test(s) Then
        Set m = Regex.Execute(s)(0).submatches
        Debug.Print m(0), "'" & m(1) & "'", m(2)
    End If
End Sub

更新:捕获 = 和任何空格

【讨论】:

  • 效果很好,谢谢。唯一的评论是 = i 需要将其保留在第一个捕获组中,有遵循此模式的单词 abc = 4abc=4 abc= 4 并且当我替换数字时有必要保留空格。
  • @Eduardo 好的,请参阅更新,如果您也想捕获 equals,请使用 m(0) & m(1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 2021-04-08
  • 2011-05-06
  • 2019-11-01
  • 2011-06-03
  • 1970-01-01
相关资源
最近更新 更多