领先的角色阻止正则表达式匹配?

时间:2015-03-05 01:27:37

标签: regex

如果我知道我需要的正则表达式功能的名称,我会有一个更好的标题。

作为验证任务,我需要验证文本流是否只包含与我已建立的正则表达式模式匹配的部分,无论它发生了多少次。例如,如果我的模式是“foo”并且我有字符串

 "foo foofoo" 

结果应该是三个匹配项,而不是其他不匹配的文本。相反,字符串

"foo foo fooo"  

应返回三个匹配项,但我需要检测剩余的可打印字符“o”是否匹配。我的第一个是将管道字符用于“或”逻辑,如“(?:foo) |(\ S )”,我认为我对它进行了排序,但字符串

"-foo foo foo" 

只匹配两次。看起来前导字符会使引擎跳到表达式的右侧,因为它被广泛定义,它会捕获到下一个单词中断。很明显,我的心理表现并不反映发动机的运行方式。我哪里错了?

3 个答案:

答案 0 :(得分:0)

你想要搜索"foo"及其后面的任何字符,直到下一个foo。为了做到这一点,你需要一个负面的先行断言(检查'其他东西没有跟随的东西')。所以你的正则表达式将是"foo.*?(?!foo)"

答案 1 :(得分:0)

好像你想要这样的东西,

(?<![^\w\s])foo

DEMO

答案 2 :(得分:0)

你可以这样做:

\b(?:foo)\b|\b(?:foo)+\b

Demo

也许更好:

\b(?:foo)\b|\b(?:foo){2,}\b

Demo 2