我正在使用字节梳中的包装器(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

“伊拉克”和“退出”按预期工作。对于下一组输入文本字符串,我希望提取“ 67.89”,而对于第三个”,.89”。最初,我为浮动十进制数字制定了 d+。添加括号没有帮助。删除或帮助67.89。最后,我找到了一个工作解决方案。但是有更好的东西吗?您能帮我了解优先顺序吗?如果可能的话,我想将其保留在或在一起的两个部分。

谢谢,不是一个程序员!

有帮助吗?

解决方案

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

或“ |”如果您想这样思考,则具有最高优势,将图案分为两种可能的匹配: \d+\.?\d*\.\d+(?=\s*ch)

如果你想防止 \d+\.?d* 从匹配23.5开始,您必须添加额外的条件,例如在其之前需要一个空间字符,并使用捕获括号将数字作为subbatch: \s(\d+\.?\d*)

您可以与此模式匹配, \s(\d+\.?\d*)|\.\d+(?=\s*ch), ,但请记住,如果上半场匹配,您将查看实际值的subsatches。

这里真正的问题是,VBScript的Regexp类不支持BoeBehind,而只是LookAhead。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top