匹配不以不同字符串开头的字符串

时间:2013-06-21 06:56:07

标签: php regex regex-negation

我希望只有当字符串milk在任何时间都没有被4个特定单词中的任何一个或全部单词表示时才会出现匹配(为简单起见,请将这些单词称为AA,BB,CC,DD)。

所以I went to the store and bought some milk会匹配,但以下情况不会:

AA went to the store and bought some milkBBCCDDmilk

换句话说,我如何得到相反的反应:/.*?(AA|BB|CC|DD).*?milk/

我想我应该在某处放一个插入符号,但是无法弄明白。谢谢。

1 个答案:

答案 0 :(得分:1)

描述

此正则表达式将验证给定文本中的每一行,以确保它在任何一行上的字符串milk之前没有字符串{aa,bb,cc,dd}。然后返回匹配的行。注意:OP中的示例表明匹配的“单词”只是字符串,空格和单词边界无关紧要。

^(?!.*?(?:AA|BB|CC|DD).*?milk).*

  • ^将此匹配锚定到该行的开头
  • (?!开始负面展望,如果我的内容成功匹配,那么我将失败
  • .*?(?:AA|BB|CC|DD).*?milk寻找字符串aa bb cc dd后跟字符串牛奶
  • )结束了前瞻
  • .*匹配整个句子

enter image description here

PHP代码示例:

输入文字

AA went to the store and bought some milk
BBCCDDmilk
I went to the store and bought some milk
Aardvarks like milk

<强>代码

<?php
$sourcestring="your source string";
preg_match_all('/^(?!.*?(?:AA|BB|CC|DD).*?milk).*/im',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

<强>匹配

$matches Array:
(
    [0] => Array
        (
            [0] => I went to the store and bought some milk
        )

)