正则表达式不包含某字符串区配写法示全

发布时间:2019-10-25编辑:脚本学堂
本文介绍了正则表达式不包含某字符串匹配的写法,用正则表达式判断一个字符串中是否含有另一字符串,感兴趣的朋友参考下。

判断一个字符串中是否含有另一字符串,有很多方法,如下:

1. 常见函数
 

strstr($str, "abc");

2. 正则匹配
 

preg_match("/(abc)/is", $str);

但是要匹配一个字符串中,不包含某字符串,用正则就比较麻烦了。
1. 如果不用正则如下就可以解决问题
 

!strstr($str, "abc");

2. 正则写法
 

preg_match("/^((?!abc).)*$/is", $str);

完整代码:
 

$str = "dfadfadf765577abc55fd";
$pattern_url = "/^((?!abc).)*$/is";
if (preg_match($pattern_url, $str))
{
echo "不含有abc!";
}
else
{
echo "含有abc!";
}

结果为:false,含有abc!

同时匹配,包含字符串 "abc",而且不包含字符串 "xyz"的正则表达式
 

preg_match("/(abc)[^((?!xyz).)*$]/is", $str);

该方法有效:
 

(?:(?!</div>).|n)*? //匹配不含</div>的一个字符串

但最终使用中结果是发现,该方法效率极其低下,在处理非常短文字(要匹配该正则式的相同部分的有十几个字,或者最多几十个)时间可以考虑使用,但当用于大篇幅文章解析或多处需要改种匹配时间应不使用,考虑用其他方法替代(如:先解析出要匹配该段正则式的文字,然后验证其中是否存在某段文字),正则表达式对于匹配不含特定字符串的文字段时并不是非常有效的方法.

正则删除不包含某个字符串的行的代码

分析apacherizhi/ target=_blank class=infotextkey>apache日志时,在日志中发现了一个比较可疑的ip,出现频率颇高,但每天的日志有几百万行,如何从中几百万行中找出需要的数据来进行分析呢?

可疑的ip,58.63.144.170,据说是一个弱智的蜘蛛,上帝保佑它下地狱。

看过apache日志的朋友应该知道,apache的访问日志的每一行是以访问者的ip开始的。因为日志比较大,所以我是用ultraedit来看的。用ultraedit的时候需要注意,它的正则一共有两种,一种是符合perl规范的,而默认的是ut自带的一种,写法比较特殊。本文中用到的正则表达式都是perl兼容的,ut中这个选项可以在“高级->配置->搜索->正则表达式引擎”中进行修改。

发现自己掌握的正则表达式中好象没有能直接删除“不包含”一个指定串的用法。

先写一个包含指定串的再说吧:
^(58.63.144.170).*$
测试,可以把包含指定ip的行找出来,接下来要做的就是怎么把这些行保留下来而删除另外的行。

在尝试了N次以后,我终于放弃了直接删除不包含这个ip的行的想法。
怎么办?退一步海阔天空!既然不能直接删除,那就迂回一下吧。
虽然不能直接删除不包含指定串的行,但删除不包含指定字符的正则我还是会写的:)

先给包含指定ip的行做个标志,这里要用到ut的替换功能。
要查找的行:^(58.63.144.170)(.*)。
因为日志的每一行都是以数字开始的,所以我选择‘%'做为标志的特殊符号,要替换成的正则为:%$1$2。
全部替换以后,包含指定ip的行就变成了这个样子:
%58.63.144.170……。

接下来,再把行首不是‘%'的行删掉,查找:^[^%].*,替换处为空。执行全部替换,日志中只剩下了以‘58.63.144.170'开头的行,大功告成!等等,剩下的空行太难看,让我们把它们干掉,查找:^[rn]*$,替换处为空,执行全部替换,世界终于清静了...

其实本文中用的正则都是很基本的东西,虽然最终没能写出删除包含指定字符串的行的正则,但在迂回中最终也是现实了想要的功能,而且看上去也更清晰一些。

以上就是有关正则表达式不包含某字符串的字符串匹配方法,希望对大家有所帮助。