我需要找到输入文本中包含(?i:val)
且不再是5个字符的所有单词。
到目前为止,我得到了:\b([a-zA-Z]*(?i:val)[a-zA-Z]*){1,4}\b
如果我们采用此示例文字来查看:In computer science, a value is an expression which cannot be evaluated any further (a normal form). Val is also a match
我得到3场比赛(value
,evaluated
和Val
),但是evaluated
不应该与模式匹配,因为它太长了。什么是正确的方法?
答案 0 :(得分:3)
您的模式未考虑匹配的字词的长度。
使用单词边界和这样的前瞻:
(?i)\b(?=\w*val)\w{1,5}\b
请参阅regex demo
正则表达式匹配:
\b
- 自下一个模式为\w
(?=\w*val)
- 确保在零个或多个单词字符后面有val
子字符串的预测\w{1,5}
- 匹配1到5个字符\b
- 尾随单词边界,用于停止匹配您可以使用正则表达式的ASCII JS版本:
/\b(?=[a-z]*val)[a-z]{1,5}\b/i
答案 1 :(得分:1)
了解为什么"评估"匹配。注意:
[a-zA-Z]*
与" e" (?i:val)
匹配" val" [a-zA-Z]*
匹配" uated" 实际上这里没有重复!该模式仅在一次迭代中匹配。
您可以使用lookarounds实现所需,但我认为正则表达式不是执行此任务的最佳工具。我强烈建议您使用其他功能,具体取决于您拥有的功能。