`
lenovo123
  • 浏览: 11372 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

转:使用正则表达式找出不包含特定字符串的条目

阅读更多

转自:http://msdn.microsoft.com/zh-cn/ff695469.aspx

 

本文来自Kevin Yang博客 作者:Kevin Yang

概述

做日志分析工作的经常需要跟成千上万的日志条目打交道,为了在庞大的数据量中找到特定模式的数据,常常需要编写很多复杂的正则表达式。例如枚举出日志文件中不包含某个特定字符串的条目,找出不以某个特定字符串打头的条目,等等。

使用否定式前瞻

正则表达式中有前瞻(Lookahead)和后顾(Lookbehind)的概念,这两个术语非常形象的描述了正则引擎的匹配行为。需要注意一点,正则表达式中的前和后和我们一般理解的前后有点不同。一段文本,我们一般习惯把文本开头的方向称作“前面”,文本末尾方向称为“后面”。但是对于正则表达式引擎来说,因为它是从文本头部向尾部开始解析的(可以通过正则选项控制解析方向),因此对于文本尾部方向,称为“前”,因为这个时候,正则引擎还没走到那块,而对文本头部方向,则称为“后”,因为正则引擎已经走过了那一块地方 。如下图所示:

所谓的前瞻就是在正则表达式匹配到某个字符的时候,往“尚未解析过的文本”预先看一下,看是不是符合/不符合匹配模式,而后顾,就是在正则引擎已经匹配过的文本看看是不是符合/不符合匹配模式。符合和不符合特定匹配模式我们又称为肯定式匹配和否定式匹配

现代高级正则表达式引擎一般都支持都支持前瞻,对于后顾支持并不是很广泛,因此我们这里采用否定式前瞻来实现我们的需求。

所谓的前瞻就是在正则表达式匹配到某个字符的时候,往“尚未解析过的文本”预先看一下,看是不是符合/不符合匹配模式,而后顾,就是在正则引擎已经匹配过的文本看看是不是符合/不符合匹配模式。符合和不符合特定匹配模式我们又称为肯定式匹配和否定式匹配

现代高级正则表达式引擎一般都支持都支持前瞻,对于后顾支持并不是很广泛,因此我们这里采用否定式前瞻来实现我们的需求。

1. 把8号的数据过滤掉

2. 把那些不包含robots.txt字符串的条目给找出来(只要Url中包含robots.txt的都给过滤掉)

前瞻的语法是:

(?!匹配模式)

我们先来实现第一个目标——匹配不以特定字符串开头的条目

这里我们因为要排除一段连续的字符串,因此匹配模式非常简单,就是2009-07-08。实现如下:

^(?!2009-07-08).*?$

用Expresso我们可以看到结果确实过滤掉8号的数据。

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

按照我们上面写法,我照葫芦画瓢了一下:

^.*?(?!robots\.txt).*?$

这段正则用大白话描述就是:开头任意字符,然后后面不要跟着robots.txt连续字符串,然后再跟着任意个字符,字符串结尾。

运行测试,结果发现:

没有达到我们想要的效果。这是为什么呢?我们给上面的正则表达式加上两个捕获分组调试一下:

^(.*?)(?!robots\.txt)(.*?)$

测试结果:

我们看到,第一个分组啥都没有匹配到,而第二个分组却匹配了整个字符串。再回过头来好好分析一下刚才那个正则表达式。实际上,当正则引擎解析到A区域的时候,就已经开始执行B区域的前瞻工作。这个时候发现当A区域为Null的时候匹配成功——.*本来就允许匹配空字符,前瞻条件又满足,A区域后面紧跟着的是“2009”字符串,而并不是robots。因此整个匹配过程成功匹配到所有条目。

分析出原因之后我们对上述的正则进行修正,将.*?移入前瞻表达式,如下:

^(?!.*?robots).*$

测试结果:

 

分享到:
评论

相关推荐

    使用正则表达式找出不包含特定字符串的条目

    例如枚举出日志文件中不包含某个特定字符串的条目,找出不以某个特定字符串打头的条目,等等。 使用否定式前瞻 正则表达式中有前瞻(Lookahead)和后顾(Lookbehind)的概念,这两个术语非常形象的描述了正则引擎的...

    使用Java正则表达式分析处理日志

    3. **统计和分析**:通过正则表达式,我们可以计算特定错误发生的次数,或者找出特定模式的日志。例如,如果日志中包含错误信息的字符串,我们可以使用`Matcher.groupCount()`来统计匹配到的错误数量。 4. **异常...

    linux shell 命令, 脚本编程

    - **8.2.11 查询格式化文件名**:使用正则表达式匹配特定模式。 - **8.2.12 查询IP地址**:使用正则表达式匹配IP地址格式。 **8.3 小结**:本章详细介绍了grep命令的使用方法及其与正则表达式的结合应用,帮助...

    MySQL模糊查询语法[文].pdf

    - 日志分析,找出满足特定模式的日志条目。 综上,MySQL的模糊查询功能为数据检索提供了极大的灵活性,无论是简单的SQL模式还是更复杂的正则表达式,都能帮助我们有效地处理和过滤数据。在实际应用中,根据需求...

    Python Cookbook

    6. **3.6 检查字符串是否包含一组字符**:提供了检测字符串中是否存在特定字符或子串的方法。 7. **3.7 过滤字符串中的一组字符**:介绍了如何删除字符串中不符合条件的字符。 8. **3.8 控制大小写**:介绍了如何...

    editplus 代码编辑器html c++ jsp css

    注意:其实就是正则表达式替换,这里只是把一些曾经提出的问题加以整理,单纯从正则表达式本身来说,就可以引申出成千上万种特例。 【2】正则表达式应用——数字替换 希望把 asdadas123asdasdas456asdasdasd789...

    模糊匹配搜索

    它允许用户输入不完全准确或不完整的关键词,系统通过一定的算法找出与这些关键词相关的条目,即使这些条目并不完全匹配输入的字符串。这种技术在各种应用场景中非常常见,如搜索引擎、推荐系统、数据过滤等,极大地...

    log 特定字串文字提取_definition4lf_excel_frontuhr_ExcelVBA_

    2. **提取特定字符串**:通过VBA,定义一个函数来搜索包含特定字符串的日志条目,然后将相关数据提取到Excel工作表的特定列。 3. **数据清洗和整理**:根据需要,可能需要对提取的数据进行清洗,例如去除不必要的...

    Editplus 3[1].0

    注意:其实就是正则表达式替换,这里只是把一些曾经提出的问题加以整理,单纯从正则表达式本身来说,就可以引申出成千上万种特例。 【2】正则表达式应用——数字替换 (Microshaoft@CCF,jiuk2k@CCF) 希望把 ...

    网页邮箱账号提取

    3. **正则表达式**:正则表达式(Regex)是用于匹配字符串模式的强大工具。在邮箱提取中,我们可以编写一个正则表达式来识别符合电子邮件地址标准的模式,如`\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b`...

    EditPlus 2整理信箱的工具

    注意:其实就是正则表达式替换,这里只是把一些曾经提出的问题加以整理,单纯从正则表达式本身来说,就可以引申出成千上万种特例。 【2】正则表达式应用——数字替换 (Microshaoft@CCF,jiuk2k@CCF) 希望把 ...

    批处理中字符串分割实现代码

    ### 批处理中字符串分割实现代码详解 ...此外,还可以探索其他处理字符串的方法,例如使用正则表达式等高级技术来增强批处理脚本的能力。 以上就是关于批处理中字符串分割实现代码的详细介绍,希望对大家有所帮助。

    LINUX与UNIX SHELL编程指南

    - **7.4 使用*匹配字符串中的单字符或其重复序列**:`*`匹配前面的字符0次或多次。 - 示例:`grep "hel*o" file.txt` - **7.5 使用\屏蔽一个特殊字符的含义**:`\`用来转义特殊字符。 - 示例:`grep "\." file.txt...

    文件内容搜索工具

    在IT领域,文件内容搜索工具是一种非常实用的软件,它能帮助用户快速定位到包含特定字符串的文件。本文将深入探讨“文件内容搜索工具”的核心功能、工作原理以及如何使用FileLocator Pro这款高效的搜索工具。 文件...

    cs50-dna-analyzer:此程序将提取DNA字符串中STR(短串联重复序列)的数目,并将其与STR值的CSV文件进行匹配,以便在列表中识别出罪魁祸首

    `cs50-dna-analyzer` 是一个Python程序,它的主要任务是对DNA字符串进行处理,找出其中的STR序列并计算其重复次数。这个程序可能是为了解决特定的案例,比如犯罪现场的物证分析,通过比对STR值与数据库中的样本,...

    LINUX与UNIX_Shell编程指南(上)

    7.4 使用*匹配字符串中的单字符或其重复 序列 51 7.5 使用\屏蔽一个特殊字符的含义 52 7.6 使用[]匹配一个范围或集合 52 7.7 使用\{\}匹配模式结果出现的次数 53 7.8 小结 55 第8章 grep家族 56 8.1 grep 57 8.1.1 ...

    Linux与unix shell编程指南(1-16)

    7.4 使用*匹配字符串中的单字符或其重复 序列 51 7.5 使用\屏蔽一个特殊字符的含义 52 7.6 使用[]匹配一个范围或集合 52 7.7 使用\{\}匹配模式结果出现的次数 53 7.8 小结 55 第8章 grep家族 56 8.1 grep 57 8.1.1 ...

Global site tag (gtag.js) - Google Analytics