我正在尝试解析并捕获表达式中的组:
但我无法将%case与正则表达式匹配:
(\w+) *= *(\w+|\d+(?:\.\d+)?%?)
最令人惊讶的是,如果我停止接受单词,我可以匹配百分比 - 删除\w+
:
(\w+) *= *(\d+(?:\.\d+)?%?)
我使用了debuggex和regex101来理解为什么会这样,但到目前为止还没有成功。
答案 0 :(得分:2)
答案 1 :(得分:1)
答案 2 :(得分:1)
您在此处获得了一些有效的答案和建议,但最简单,最有效的表现方式是首先简单地测试最复杂的变体。像...
(\w+) *= *(\d+(?:\.\d+)?%?|\w+)
如果可以,只需先测试十进制数就会匹配,否则继续单词的替换。
这是以15个步骤完成的,例如(\w+) *= *(\w+|\d+(?:\.\d+)?%?)(?=\s|$)
需要两倍。
答案 3 :(得分:1)
问题确实是\w+
。这也匹配数字,并首先尝试
虽然\w+
贪婪地匹配,但完整表达式却没有。因此\w+
匹配10
(10.0%
之外)并且匹配成功。由于我们取得了成功,因此无需尝试\w+|\d+(?:\.\d+)?%?
的替代路径。
重新排序正则表达式:
(\w+) *= *(\d+(?:\.\d+)?%?|\w+)
完全匹配abc = 10.0%
。
另一种选择是添加锚点。如果此表达式需要匹配完整的行,请添加$
,否则在匹配后添加一个(如果需要的非分组)表达式,例如(?:\s|$)
,从而生成完整的表达式:
(\w+) *= *(\w+|\d+(?:\.\d+)?%?)(?:\s|$)