日志分析通常需要处理数以千计的日志条目。为了在大量的数据中找到特定的模式数据,常常需要编写许多复杂的正则表达式。例如,日志文件中不包含特定字符串的条目,查找不以特定字符串开头的项,等等。

使用负的前瞻性

在一个正则表达式(前瞻)和向后(追溯)的概念,这两个术语是正则匹配引擎的行为非常生动的描述。需要注意的是,前面和后面的正则表达式是从前面一点不同与我们一般的理解回来。在一个文本,我们一般利用文本开始的方向为前,正文和结尾叫回来。但对于正则表达式引擎,因为它是从文本分析出发,尾头(可以通过定期的选项控制分辨率的方向),因此文本的尾部方向,称为前,因为这个时候,也没有去正规的机体,但文本是头直接因为发动机的正常位置是这样的,如下图所示:





所谓的向前看,在正则表达式匹配一个字符,不预解析文本看,看是不是符合/不符合匹配模式,和顾,文本是一个规则引擎都有,看是不是符合/不符合模式匹配。我们也被称为肯定的匹配负匹配,符合和不符合特定模式匹配。

高级正则表达式引擎一般支持支持和前瞻性,而不是非常广泛,所以在这里我们使用负透视来实现我们的需求。

实现

测试数据:

复制代码代码如下所示:

2009-07-07 04:38:44 127.0.0.1得到 / robots.txt

2009-07-07 04:38:44 127.0.0.1得到 /职位/ robotfile.txt

2009-07-08 04:38:44 / 127.0.0.1得到



例如,上面简单的日志条目,我们想实现两个目标:

1。过滤掉数字8

2。发现不包含robots.txt字符串的项(只要robots.txt是过滤掉在URL)。

未来的语法是:

(!匹配模式)我们首先实现第一个目标匹配项,而不是从一个特定的字符串开始。

在这里,我们要排除一个连续的字符串的字符串,所以匹配模式很简单,就是2009-07-08.the实施如下:

复制代码代码如下所示:

* ^美元(2009-07-08!)



咖啡,我们可以看到,这样做的结果筛选出8号。

接下来,让我们实现包含特定字符串的第二个目标-排除条目。

正如我们写的那样,我画了葫芦。

复制代码代码如下所示:

*



这条规则进行了白话:开始与任何字符,那么不遵循robots.txt连续字符串,然后遵循任何字符串。

运行测试,结果如下:



它不能达到我们想要的效果,为什么呢让我们用两个捕获组调试上面的正则表达式:

复制代码代码如下所示:

(*)(机器人!)(*)。



测试结果:



我们看到第一组没有匹配任何东西,第二组匹配整个字符串。回顾并分析正则表达式。事实上,当常规引擎解析到一个区域时,它已经开始执行B区域的正向工作。最初,允许null条件,并满足预期的区域,其次是2009个字符串,而不是机器人,所以整个匹配过程成功地匹配所有条目。



修改后规则性的原因分析。查看表达式如下:

复制代码代码如下所示:

**(*机器人!)



测试结果:



完成

不包含PHP中特定字符串的常规实现的实现

preg_match( / ^((!ABC);

完整的代码示例

复制代码代码如下所示:

$str =dfadfadf765577abc55fd ;

pattern_url美元= / ^((!ABC)。* $ IS };

如果(preg_match($ pattern_url,$str))

{

不含abc!;

}

其他的

{

包含ABC!;

}



结果是:含有ABC的false!

同时,它包含字符串ABC,并且不包含字符串某某的正则表达式:

(preg_match /(ABC){ ^((!XYZ);

该方法是有效的,我使用的方法如下:

(())| 。)不包含字符串。

但最后发现使用这种方法,效率很低,在很短的文本(匹配的十几个,正则表达式相同的部分或达数十次)可以使用,但当用于分析或更需要补种,时间不应被使用,通过其他方法考虑替代(如:第一,常规解析出来的文本样式然后验证一段文字的存在),对文本段的正则表达式,包括特定字符串不是很有效。