正则表达式随笔.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
正则表达式随笔 文 / 余晟 环视结构( look-around ) 分析日志(或普通数据文件),恐怕是大家在日常工作中经常遇到的问题,正则表达式 应当是理所当然的选择,简单的正则表达式应用,大家应该都会,即使暂时不熟悉,查 查资料也能解决。但是,有时候情况复杂,看起来正则表达式往往 “束手无策 ”,其实事 实并非如此。在这篇文章中,我们通过一个具体的例子,来讲解正则表达式的高级技巧。 事情源于朋友的一封来信: “最近我遇到个小问题:公司让我处理日志文件,说实话我还真是巧,本来没有打算学正 则,要是没有正则可能我这次还不知道怎么处理。简单说一下,主要任务是逐行读取数 据,对每行内容进行分析,第一行是字段名,其余是日志内容,行与行之间没有联系, 每行中字段内容用逗号隔开(但前两个字段和最后两个字段没有引号包围),逗号中的 数据内容是用引号包围起来的,因为在生成日志的时候,没有考虑到在引号中的数据会 存在逗号,所以无法整齐用切割函数类似 split() 的函数以逗号进行分割。所以我想了一 个办法:把引号中的逗号全部换成别的符号,这样就可以切割了,我想了个正则表达式 『(FT) 』,用它来找出引号字段,然后将其中的逗号替换掉,再处理。不知道有没 有其它更好的办法? ” 示例: 2007-11-6 0:41:37,15,98,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NETCLR .1.4322),gzzstresw,jgubrmkizefns55,,/ShowData.aspx, ?db=cecdbid=h17753p=, 大发财集团有限公司 ,浏览免费数据, /somepath/07002.html,d1 ,,db=cecdbdt=dataid=h17753p=0,0,0 ,浏览免费数据 在这行数据中,共有两个字段包含引号且其中有逗号,它们分别是: gzzstresw,jgubrmkizefns55 d1, 浏览免费数据 类似的任务,许多读者应该都遇到过;类似的问题,或许大家都经历过 —— 应用正则表 达式时,有没有更好的办法?答案是:有,我们可以只用一个正则表达式,一个函数, 实现完美的切分! 在详细的讲解之前,我们先罗列问题的特征: 每行数据分为许多字段,以逗号分隔 有的字段以引号包围,有的没有引号 有引号的字段不可能出现在这一行的开头和结尾 引号包围的字段中,可能存在逗号(补充一点,逗号不可能紧挨引号,而且这样的字 段中逗号只有一个) 了解了这个问题,我们就可以着手考虑如何应用正则表达式了。我们知道,正则表达式 的应用方式,通常有三大类:查找、替换和切分。查找,也叫提取、搜索,是从文本中 提取具有某种结构特征的字符串;替换,类似于替换,是操作文本中具有某种结构特征 的字符串,不过替换的字符串根据被替换字符串的内容动态生成;切分,是先在文本中 进行查找,找到所有(或部分)具有某种结构特征的字符串,以它们为分隔符,将文本 切分开来。针对这个具体的问题,我们最先想到的操作就是:切分。 如果使用切分,则作为切分符的逗号必须满足下面两个要求之一: 1. 之前和之后都是引号; 2. 不在引号字段之内。 针对第一个要求,选择的逗号之前和之后都必须有引号,写成正则表达式就是 『(?=),(?=) 』,在这里我们使用了如今大多数正则表达式系统都支持环视 ( look-around )结构,用来规定需要查找的文本之前和之后的文本特征。其中的 『 (?=),(?=) 』称为逆序环视( look-behind )结构,表示逗号之前(左侧)必须出 现一个引号,『 (?=),(?=) 』是顺序环视( look-ahead )结构,表示逗号之后(右 侧)必须出现一个引号。在这里,『 (?=) 』和『 (?=) 』都是正则表达式预先定义的 特殊结构,它们非常形象,大家在使用时可以按照具体的要求,把引号替换成自己需要 的子表达式; 第二点要求逗号不能在引号字段内,如何判断逗号是否在引号字段内呢?我们不妨这样 想:如果逗号在引号字段内,那么它与之前(左边)的第一个逗号(或者行开头位置) 之间,必然存在引号(因为引号字段内不可能存在多于一个的逗号)。也就是说,我们 要寻找的逗号与它之前的第一个逗号之间,不容许存在引号。仍然使用环视结构,我们 得到这样一个正则表达式『(?=(F)F]+), 』。其中『(?=(F)F]+), 』对应 之前的逗号或是行开头位置,而『(?=(,|A)[A]+), 』表示两个逗号(或行开头与逗 号)之间的字符不能是引号,否则就会匹配失败。这个表达式能够找到的逗号,应该就 是我们需要的逗号了。 最后,因为这两个要求是 “或( or )”的关系,我们使用多选分支将它们并列起来,

文档评论(0)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档