2013-06-21 99 views
0

只有在字符串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

说明

此正则表达式将验证在给定的文本的每一行,以确保它不具有串{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 
     ) 

) 
+1

完美,谢谢! – avedeversailles

+0

原来的问题说:“所以我去商店买了一些牛奶会匹配”,但上面的正则表达式不匹配,至少在我使用它。为了找到包含牛奶的字符串,肯定要在“牛奶”之前关闭否定匹配。所以对我来说,有效的是“^(?!。*?(?: AA | BB | CC | DD))。*?milk。* – Beel

+1

这是一个神话般的文章,它向我展示了如何解决我的问题,并比其他帖子更好地引用作为重复。竖起大拇指! – Beel