为什么我的这个特殊的排他性正则表达式失败了?

时间:2013-08-14 15:34:01

标签: regex

以下排他性正则表达式应仅匹配(抛出错误)括号中的字符< > = 但是,它也会在字符串末尾抛出一个空格。为什么呢?

/^((?![<>=]).)*$/

1 个答案:

答案 0 :(得分:0)

如果它是一个完整的字符串,你不需要环顾四周。问题是环顾四周需要一定数量的字符才能工作(取决于实现意味着通常没有通配符)。

如果您要检查整个字符串,可以使用:

/^[^<>=]+$/

如果您正在尝试确保字符串开头没有出现,那么您可以使用

/^[^<>=]/   

字符串结尾

/[^<>=]$/

开始或结束(不要担心中间)你应该可以使用它。

/(^[^<>=]|[^<>=]$)/

如果我们使用以下代码在PHP中测试它们:

<?php

$phrases = array('dog','cat=dog','<a href=','bird=');

$patterns = array('/^[^<>=]+$/','/^[^<>=]/','/[^<>=]$/','/(^[^<>=].*[^<>=]$)/');

foreach($phrases as $phrase){

    foreach($patterns as $pattern){
        if(preg_match($pattern,$phrase)){
       echo '`'.$pattern."` matches `".$phrase."`\n";   
    } else {
       echo '`'.$pattern."` doesn't match `".$phrase."`\n";         
        }
    }


}


?>

我们得到以下输出

/^[^<>=]+$/匹配dog

/^[^<>=]/匹配dog

/[^<>=]$/匹配dog

/(^[^<>=].*[^<>=]$)/匹配dog

/^[^<>=]+$/cat=dog

不符

/^[^<>=]/匹配cat=dog

/[^<>=]$/匹配cat=dog

/(^[^<>=].*[^<>=]$)/匹配cat=dog

/^[^<>=]+$/<a href=

不符

/^[^<>=]/<a href=

不符

/[^<>=]$/<a href=

不符

/(^[^<>=].*[^<>=]$)/<a href=

不符

/^[^<>=]+$/bird=

不符

/^[^<>=]/匹配bird=

/[^<>=]$/bird=

不符

/(^[^<>=].*[^<>=]$)/bird=

不符