奇怪的单词或百分比正则表达式案例

时间:2016-07-07 07:13:12

标签: regex

我正在尝试解析并捕获表达式中的组:

  • abc = def
  • abc = 10
  • abc = 10%
  • abc = 10.0
  • abc = 10.0%

但我无法将%case与正则表达式匹配:

(\w+) *= *(\w+|\d+(?:\.\d+)?%?)

Regular expression visualization

Debuggex Demo

最令人惊讶的是,如果我停止接受单词,我可以匹配百分比 - 删除\w+

(\w+) *= *(\d+(?:\.\d+)?%?)

我使用了debuggex和regex101来理解为什么会这样,但到目前为止还没有成功。

4 个答案:

答案 0 :(得分:2)

您可以使用:

/(\w+) *= *(\d+(?:\.\d+)?%?|\w+)/

即。因为\w+还包含数字,所以在\w之前匹配您的数字。

RegEx Demo

答案 1 :(得分:1)

在最后添加(?=\s|$),它应该可以正常工作。

 (\w+) *= *(\w+|\d+(?:\.\d+)?%?)(?=\s|$)

example

答案 2 :(得分:1)

您在此处获得了一些有效的答案和建议,但最简单,最有效的表现方式是首先简单地测试最复杂的变体。像...

(\w+) *= *(\d+(?:\.\d+)?%?|\w+)

如果可以,只需先测试十进制数就会匹配,否则继续单词的替换。

这是以15个步骤完成的,例如(\w+) *= *(\w+|\d+(?:\.\d+)?%?)(?=\s|$)需要两倍。

See it here at regex101

答案 3 :(得分:1)

问题确实是\w+。这也匹配数字,并首先尝试 虽然\w+贪婪地匹配,但完整表达式却没有。因此\w+匹配1010.0%之外)并且匹配成功。由于我们取得了成功,因此无需尝试\w+|\d+(?:\.\d+)?%?的替代路径。

重新排序正则表达式:

(\w+) *= *(\d+(?:\.\d+)?%?|\w+)

完全匹配abc = 10.0%

另一种选择是添加锚点。如果此表达式需要匹配完整的行,请添加$,否则在匹配后添加一个(如果需要的非分组)表达式,例如(?:\s|$),从而生成完整的表达式:

(\w+) *= *(\w+|\d+(?:\.\d+)?%?)(?:\s|$)