【问题标题】:How to simulate lookbehind in VBA regex?如何在 VBA 正则表达式中模拟lookbehind?
【发布时间】:2015-03-24 07:03:11
【问题描述】:

我正在尝试构建一个正则表达式模式,如果字符串以某些字符开头或包含非单词字符,它将返回 False,但是因为 VBA 的 RegExp 对象不支持后向查找,我发现这很难.唯一应该失败的单词字符前缀是 B_、B-、b_、b-。

这是我的测试代码:

Sub testregex()

Dim re As New RegExp

re.pattern = "^[^Bb][^_-]\w+$"

Debug.Print re.Test("a24")
Debug.Print re.Test("a")
Debug.Print re.Test("B_")
Debug.Print re.Test(" a1")


End Sub

我希望这个返回:

True
True
False
False

但它会返回

True
False
False
True

问题是该模式查找不在[Bb] 中的字符,然后是不在[-_] 中的字符,然后是一系列单词字符,但我想要的只是一个或多个单词字符, 这样如果有 2 个或更多字符,则前两个不是 [Bb][-_]

【问题讨论】:

  • 在表达式" a1"中有2个或多个字符,前两个不是[Bb][-_],但是你想让.Test(" a1")返回False。按照您的定义,它应该是True。请解释我是否遗漏了什么?
  • @omegastripes,字符串应该只有单词字符,这就是我在正则表达式模式中使用\w的原因。
  • @femtoRgon,是的,我目前的解决方法涉及两个正则表达式。我希望找到一个单一的正则表达式解决方案,因为这将有助于代码的可扩展性。

标签: regex vba excel


【解决方案1】:

尝试匹配这个表达式:

^([Bb][\-_]\w*)|(\w*[^\w]+\w*)$

...它将匹配“B_”、“b_”、“B-”和“b-”或任何非单词字符。将成功匹配视为“失败”,只允许不匹配有效。

【讨论】:

  • 虽然这将排除“B_xxy”,但也会排除“B2xxy”,这应该会通过。唯一应该失败的前缀是B_,B-,b_,b-。如果我在最初的问题中没有说清楚,我很抱歉。
  • 我调整了表达方式,但最简单的方法是颠倒你对结果的看法,这样“成功”就是失败。
【解决方案2】:
re.Pattern = "^(?:[^ Bb][^ _-]\w+|[^ Bb][^ _-]|[^ Bb])$"

【讨论】:

    【解决方案3】:

    你可以得到你的匹配

    regEx.Pattern = "^[^ bB][^_ -]*\w*$"
    regEx.MultiLine = True
    Debug.Print regEx.Test("a24")
    Debug.Print regEx.Test("a")
    Debug.Print regEx.Test("B_")
    Debug.Print regEx.Test(" a1")
    

    输出:

    True
    True
    False
    False
    

    【讨论】:

      猜你喜欢
      • 2018-05-29
      • 1970-01-01
      • 2012-02-08
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多