【问题标题】:Regular Expression in Word VBAWord VBA中的正则表达式
【发布时间】:2015-06-09 06:31:36
【问题描述】:

我在 VBA 中有以下适用于 MS Word 的正则表达式语法:

regEx.Pattern = "\w*\(\w*\s[0-9]{1,3}:[0-9]{1,3}(\)|\-[0-9]{1,3}\))"
MsgBox regEx.test("This is a test (Chronicles 13:12-14)")

这将根据需要返回 True。当我试图在我的左括号之后立即包含“First”、“Second”、“Third”、1、2、3 或什么都没有的模式时,我遇到了困难。我试过[First|Second|Third|1|2|3]?但是当我在括号内添加任何这些字符串/数字时,它会返回 false。我错过了什么?

感谢您的解释和建议。我添加了最后一个“|”在它之后没有任何东西来解释缺少任何数字。我还必须在每个选项中添加空格。最终的工作版本是 "\w*\((First |Second |Third |[1-3] |)\w*\s[0-9]{1,3}:[0-9]{1,3}(\)|\-[0-9]{1,3}\))"

【问题讨论】:

    标签: regex vba ms-word


    【解决方案1】:

    字符类 ([]) 匹配任何包含的字符。因此,[First|Second|Third|1|2|3] 匹配 First|S 等。

    您需要在字符类之外使用交替。您可以使用(...) 对它进行分组,或者如果您想要一个非捕获组(?:...)

    尝试将[First|Second|Third|1|2|3] 替换为(?:First|Second|Third|[1-3])

    【讨论】:

    • 我很欣赏这个建议,它解决了与 First|Second|etc 相关的困境。但如果这些都不存在(如原始示例中所示),我也需要它返回 True。
    • 由于我已经在一个(非捕获)组中拥有它,您只需添加一个? 即可将整个组限定为可选。就像abc? 将匹配ab,可选的c...foo(?:bar)? 将匹配foo 和可选的bar
    【解决方案2】:

    如果你想使用OR 操作数,你不应该把你的话放在一个字符类中。相反,您可以使用 capture group

    (First|Second|Third|1|2|3)
    

    因为在字符类中,正则表达式引擎将您的模式假定为单词字符和字符 | 之间的任意组合。

    为了更好地理解,请参见下图:

    [First|Second|Third|1|2|3]
    

    Debuggex Demo


    (First|Second|Third|1|2|3)
    

    Debuggex Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 1970-01-01
      • 2017-01-18
      • 2016-01-13
      • 2021-04-28
      相关资源
      最近更新 更多