将前瞻与VBA中的(|)结合使用(正则表达式)

时间:2013-11-07 23:11:55

标签: regex vba operator-precedence lookahead

我正在使用Byte Comb(http://bytecomb.com/regular-expressions-in-vba/)的包装器。他们似乎工作得很好。我需要帮助制定强大的模式。

将lookahead“(?=)”与“|”组合使用时会出现意外结果。

Input Text String           Pattern                 RxMatch
-----------------           -------                 -------
iraq                q(?!u)                  q
quit                q(?!u)                  0
iraq                q(?=u)                  0
quit                q(?=u)                  q
sta.23.5  .1 words 67.89  ch    \d+\.?\d*|\.\d+(?=\s*ch)            23.5
sta.23.5  .1 words 67.89  ch    (\d+\.?\d*)|(\.\d+)(?=\s*ch)        23.5
sta.23.5  .1 words 67.89  ch    \d+\.?\d*(?=\s*ch)              67.89
sta.23.5  .1 words 67.89  ch    \d+\.?\d*(?=\s*ch)|\.\d+(?=\s*ch)       67.89
sta.23.5  .1 words .89  ch      \d+\.?\d*|\.\d+(?=\s*ch)            23.5
sta.23.5  .1 words .89  ch      (\d+\.?\d*)|(\.\d+)(?=\s*ch)        23.5
sta.23.5  .1 words .89  ch      \d+\.?\d*(?=\s*ch)              89
sta.23.5  .1 words .89  ch      \d+\.?\d*(?=\s*ch)|\.\d+(?=\s*ch)       .89

“iraq”和“退出”按预期工作。对于下一组输入文本字符串,我希望提取“67.89”,对于第三组,“。89”。最初,我为浮动十进制数制定了\ d +。?\ d * |。\ d +以涵盖这两种情况。添加括号没有帮助。删除或帮助67.89。最后我找到了一个有效的解决方但还有更好的东西吗?你能帮我理解优先顺序吗?如果可能的话,我想保留两个部分或一起。

谢谢, 值为非程序员!

1 个答案:

答案 0 :(得分:0)

\d+\.?\d*|\.\d+(?=\s*ch)适用于“sta.23.5 .1 words 67.89 ch” 首先捕获23.5因为它匹配\d+\.?\d*

或者“|”具有最高优先级,如果你想这样想,将模式分成两个可能的匹配:\d+\.?\d*\.\d+(?=\s*ch)

如果你想阻止\d+\.?d*匹配23.5,你必须添加一个额外的标准,比如在它之前需要一个空格字符,并使用捕获括号将数字作为子匹配:\s(\d+\.?\d*)

您可以使用此模式匹配\s(\d+\.?\d*)|\.\d+(?=\s*ch),但请记住,如果前半部分匹配,您将查看实际值的子匹配。

这里真正的问题是VBScript的RegExp类不支持lookbehind,只是前瞻。