需要regexp条件

时间:2016-06-23 07:23:13

标签: php regex preg-match

有必要检查字符串。它应该包含一个子字符串AND不包含其他子字符串。这应该只适用于regexp。

实施例。我们接受字符串' fruit' substring,但不接受字符串包含子字符串' love':

We all love green fruit. -> dont match
We all love to walk. -> dont match
We all green fruit. -> match

如果可能,写一个正则表达式。

/(?<!love).+fruit/ dont work

2 个答案:

答案 0 :(得分:3)

我认为这会起作用

^(?!.*\blove\b)(?=.*\bfruit\b).*
 <------------><------------->
   Don't match    Match this
    this word        word

<强> Regex Demo

注意: - 如果您认为匹配\b,则可以删除substring

答案 1 :(得分:2)

当然,您可以使用strpos实现所需,但您指定只需要一个正则表达式解决方案。请注意,这不是此任务的最佳方法除非您需要检查特定上下文中的子字符串(例如在字边界内,或在特定符号之后或之前,等)

(?<!love).+fruit正则表达式将love个子字符串前面的任何1个以上字符与fruit子字符串匹配。它将匹配I love fruit,因为lookbehind在字符串的开头断言为true,然后.+抓取整个字符串,然后回溯完成其工作以获得fruit

事实上,你只需要一个先行来检查字符串开头是否有love锚定:

^(?!.*love).*fruit
 ^^^^^^^^^^

请参阅regex demo

您只检查字符串开头的love子字符串(?!.*love)(由于^),然后,如果缺少,则正则表达式匹配任何字符串截至最后/s的字符(如果fruit修饰符未使用,则为换行符除外)。

这是PHP demo

$re = "/^(?!.*love).*fruit/"; 
if (preg_match($re, "We all love green fruit."))
{ 
   echo "Matched!";  // Won't be displayed since there is no match
}