一个perl扩展正则表达式代码分析_perl

复制代码 代码如下:

my $ip = "192.168.0.1|192.168.0.2|192.168.0.1";
if ( $ip =~ /
    ^
    (?:
        ((?:\d{1,3}\.){3}\d{1,3})
        (?=
            (?:
                \|(?!\1)(?1)
            )*
            \z
        )
        \|
    )*
    (?1)
    $
    /x ) {
    print "match\n";
}

根据perlre文档的说明,一点一点解释。 首先是/x,用这个来去除regex里的空格,不然的话写在一行太难看懂了; 然后是^,表示从最开头开始; 然后是(?:,这个表示本括号不记入反向引用$&中; 然后是((?:\d{1,3}.){3}\d{1,3}),同样里面一个(?:,也就是说这一行匹配一个ip,并计为$1; 然后是(?=,这个表示在上面那行ip的正则后面必须出现符合本括号定义,同样也不计入$&(术语叫”零宽肯定前向断言”是吧?); 然后一个隔开ip的|; 然后是(?!,这个表示本括号内的东西绝对不能出现,同样也不计入$&(术语叫”零宽否定前向断言”是吧?); 然后是\1,这个就是前面捕获的$1,跟上行解释的断言合在一起,就是|后面不能有和前面匹配的ip重复; 然后是(?1,这个表示前面捕获$1的正则表达式,也就是不重复ip的情况下,继续捕获新ip; 然后是),这个)闭合到|前面的(?:,也就是说|ip可以重复多个; 然后是\z,这个是字符串边界,相当于单行里$的作用,在本例中可以互换,用在这里,就是为了让(?!\1)的检查一直执行到最后; 然后是),闭合(?=; 然后是|和),这里闭合到^(,表示符合不重复ip条件的ip|格式不断正则匹配; 然后是(?1)$,定义最后一个ip,使用和$1相同的正则,也就是字符串至少要有一个ip。 OK,解释完毕。其实,从后往前看,反而清晰一些~~ 另:perlre中在(??{CODE})段的表述中有如下一段话“In perl 5.12.x and earlier, because the regex engine was not re-entrant, delayed code could not safely invoke the regex engine either directly with “m//” or “s///”), or indirectly with functions such as “split”.”,而(?R)和(??{CODE})做的是类似而简单的任务,所以如果linux发行版里带的perl版本不够高的话,这里就不能用(?1)的简单写法,需要自己再写一遍了。可以这么判断:

复制代码 代码如下:

my $re = $^V lt v5.14 ? '(?:\d{1,3}\.?){4}' : '(?1)';
my $ip = "192.168.0.1|192.168.0.2|192.168.0.3|192.168.0.4|192.168.0.5";
if ( $ip =~ m/
    ^
    (?:
        ((?:\d{1,3}\.?){4})
        (?=
            (?:
                \|(?!\1)$re
            )*
            \z
        )
        \|
    )*
    $re
    $
    /x ) {
    print "$1 match\n";
}

时间: 2024-10-05 05:26:42

一个perl扩展正则表达式代码分析_perl的相关文章

Alipay UED推出网站代码分析插件:Monster

Monster 是 Alipay UED 推出的网站代码分析.质量检测及评分的浏览器扩展,它能智能分析CSS.JS.HTML内容并生动形象展示网页得分情况(类似YSlow).它是一个开源项目,您可以在GoogleCode中心检出MonsterForChrome项目源代码.不久会推出Firefox版扩展. Monster主要检测规则: 检测是否有重复ID的标签: 检测是否使用内联标签嵌套块级标签,如a嵌套div: 检测https协议页面,是否使用了http协议的图片.JS.CSS等: 检测comp

免费的Lucene 原理与代码分析完整版下载

Lucene是一个基于Java的高效的全文检索库.那么什么是全文检索,为什么需要全文检索?目前人们生活中出现的数据总的来说分为两类:结构化数据和非结构化数据.很容易理解,结构化数据是有固定格式和结构的或者有限长度的数据,比如数据库,元数据等.非结构化数据则是不定长或者没有固定格式的数据,如图片,邮件,文档等.还有一种较少的分类为半结构化数据,如XML,HTML等,在一定程度上我们可以将其按照结构化数据来处理,也可以抽取纯文本按照非结构化数据来处理.非结构化数据又称为全文数据.,对其搜索主要有两种

AngularJS PhoneCat代码分析

AngularJS 官方网站提供了一个用于学习的示例项目:PhoneCat.这是一个Web应用,用户可以浏览一些Android手机,了解它们的详细信息,并进行搜索和排序操作. 本文主要分析 AngularJS 官方网站提供的一个用于学习的示例项目 PhoneCat 的构建.测试过程以及代码的运行原理.希望能够对 PhoneCat 项目有一个更加深入全面的认识.这其中包括以下内容: 该项目如何运行起来的 该项目如何进行前端单元测试 AngularJS 相关代码分析 以下内容如有理解不正确,欢迎指正

DispatcherServlet代码分析及运行过程

DispatcherServlet代码分析及运行过程 1    首先该类有一静态语块,用以加载缺省策略.     static {             ClassPathResource resource =new ClassPathResource(DEFAULT_STRATEGIES_PATH,DispatcherServlet.class);             defaultStrategies = PropertiesLoaderUtils.loadProperties(res

用于 .NET 代码分析的工具和技术

精辟的警句"过早的优化所有罪恶的根源"不同程度地归咎多年高德纳. 威廉 · Wulf 和 C.A.R. 贺. (看来贺源自一词,但 Knuth 获取信贷推广它. 请参阅bit.ly/fW1jWE为主题的 Knuth 的思考综述.) 所以平均为你勇敢.网商? 你应该忽略的性能和代码走到你的心内容吗? 最好按照智能感知的怪念头和更快的硬件,以扩展您的应用程序依赖吗? 嗯,没有. 测试的一个重要部分确保您的应用程序不仅执行没有错误,但也执行有效地反映民情. 这是哪里的代码分析工具和技术来发挥

Netty代码分析

Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序[官方定义],整体来看其包含了以下内容:1.提供了丰富的协议编解码支持,2.实现自有的buffer系统,减少复制所带来的消耗,3.整套channel的实现,4.基于事件的过程流转以及完整的网络事件响应与扩展,5.丰富的example.本文并不对Netty实际使用中可能出现的问题做分析,只是从代码角度分析它的架构以及实现上的一些关键细节. 首先来看下最如何使用Netty(其自带example

Siebel Code Analyzer 0.02发布 代码分析工具

Siebel Code Analyzer 是一款发现和分析基于最佳实践的eScript代码http://www.aliyun.com/zixun/aggregation/17253.html">常见问题的代码分析工具.配有的Perl脚本finder.pl包括以下特点:连接对象数据库和分析eScript代码不正确的终止,支持多操作系统平台(支持Perl 5.10),独立数据库(通过使用DBI)和外部的配置文件.以后的版本将会包括一个完整的eScript解析器,识别try/catch/fina

About Perl(翻译Perl官网介绍)_perl

强大, 稳定, 成熟, 可移植性 Perl 5 是一门有着26年历史的,功能强大的.性能丰富的编程语言.Perl能在超过100种的平台上运行,从便携式设备到大型主机.同时她也适合原型设计及大范围的开发项目. 如果拿Perl比做开发语言的大家庭,那么Perl 6就是这个大家庭中的一员,但同时Perl 6又是一门有自己独立开发团队的独立的语言.她的存在对Perl 5的持续开发影响不大. 白皮书: 技术展示 可供您任意使用的Perl 5 技术白皮书 Perl database ORM - 让数据库查询

Zend Framework框架路由机制代码分析_php实例

本文分析了Zend Framework框架路由机制代码.分享给大家供大家参考,具体如下: 在框架中,有关路由的调用关系为: 1.apache的mod_rewrite模块把请求路由到框架的启动脚本,一般是index.php: 2.前端控制器Zend_Controller_Front通过dispatch函数进行请求分发: 3.路由器Zend_Controller_Router_Rewrite通过route函数处理路由,对路由器中已有的路由规则,按照加入顺序的逆序(类似于栈,后进先出)对每个route