加载中…
个人资料
slummer
slummer
  • 博客等级:
  • 博客积分:0
  • 博客访问:744
  • 关注人气:6
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

如何用正则表达式匹配多行

(2007-08-13 16:37:22)
标签:

it/科技

正则表达式

多行

greta

分类: 程序人生
    正则表达式是程序员威力无比的工具之一,但如果面对的是多行文本匹配的话,会存在一定的困难,一般来说有三种解决方法:
    1.在正则表达式里面显式地使用多行模式。有的正则表达式引擎支持使用(?m)来表明匹配多行,这个在我实际使用过程中(Greta),没有成功案例;
    2.在引擎内部使用多行模式,如Greta中,使用MULTILINE来表示引擎内部使用多行匹配模式;
    3.通过正则表达式匹配换行符来达到效果,这是最简单的一种。在不修改代码的情况下,只能采用这种方式了。例如有如下文本串:
<?xml version="1.0" encoding="GB2312" ?>
<syslog company="COMPANY" product="PRODUCT">
 <event>
  <type>sign</type>
  <srcip>192.168.3.99</srcip>
  <dstip>192.168.3.74</dstip>
  <srcport>2329</srcport>
  <dstport>21</dstport>
  <protocol>ftp</protocol>
  <time>2006-2-20 14:44:25</time>
  <engine>192.168.3.59</engine>
  <digest>用户名称=yanfa5;</digest>
 </event>
</syslog>
需要从中提取出ip、端口、时间以及摘要(digest),可采用如下正则表达式:
<type>sign</type>[^.]+<srcip>(\S+)</srcip>[^.]+<dstip>(\S+)</dstip>[^.]+<srcport>(\d+)</srcport>[^.]+<dstport>(\d+)</dstport>[^.]+<protocol>(\w+)</protocol>[^.]+<time>(\S+ \S+)</time>[^.]+<engine>(\S+)</engine>[^.]+<digest>(\S+)</digest>
其本质是使用[^.]来匹配换行符,引擎内部依然使用单行模式。因为早期使用正则表达式的工具是基于行的。它们都是一行一行的读入一个文件,将正则表达式分别应用到每一行上去。在这些工具中,字符串是不包含换行符的。因此“.”也就从不匹配新行符。所以[^.]就能匹配换行符。

0

阅读 收藏 喜欢 打印举报/Report
前一篇:Fefora试用记
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有