我正在使用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。最后我找到了一个有效的解决方但还有更好的东西吗?你能帮我理解优先顺序吗?如果可能的话,我想保留两个部分或一起。
谢谢, 值为非程序员!
答案 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,只是前瞻。