转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]

本文链接: http://www.php-oa.com/2008/12/20/power-perl.html

Perl的正则是相当强大的

Perl 程序中,正则表达式有三种存在形式

分别是

(1 模式匹配:m/<regexp>/     #平时我们简写 /<regexp>/ ,略去m,

三个参数

/i不区分大小写   /s匹配任何字符    /x添加空格  /o 不重复编译正则表达示

(2 模式替换:s/<pattern>/<replacement>/

/g    进行全局替换           \U     大小写转换,例如s/(fred|barney)/\U$1/gi;
\L    转换小写                   \E    影响到剩余的(替换的)字符串
\l 和\u    写形式时(\l 和\u),只作用于下一个字符

(3 模式转化:tr/<pattern>/<replacemnt>/

这三种形式一般都和 =~ 或 !~ 搭配使用,"=~" 表示相匹配(does),"!~" 表示不匹配(doesn’t),并在左侧有待处理的标量变量。如果没有该要处理的变量,则默认为处理 $_ 变量中的内容。

表达式中的一些常用模式。

/表达式/ 结果
. 匹配除换行符以外的所有字符
x? 匹配 0 次或一次 x 字符串
x* 匹配 0 次或多次 x 字符串,但匹配可能的最少次数
x+ 匹配 1 次或多次 x 字符串,但匹配可能的最少次数
.* 匹配 0 次或多次的任何字符
.+ 匹配 1 次或多次的任何字符
{m} 匹配刚好是 m 个 的指定字符串
{m,n} 匹配在 m个 以上 n个 以下 的指定字符串
{m,} 匹配 m个 以上 的指定字符串
[] 匹配符合 [] 内的字符
[^] 匹配不符合 [] 内的字符
[0-9] 匹配所有数字字符
[a-z] 匹配所有小写字母字符
[^0-9] 匹配所有非数字字符
[^a-z] 匹配所有非小写字母字符
^ 匹配字符开头的字符
$ 匹配字符结尾的字符
\d 匹配一个数字的字符,和 [0-9] 语法一样
\d+ 匹配多个数字字符串,和 [0-9]+ 语法一样
\D 非数字,其他同 \d
\D+ 非数字,其他同 \d+
\w 英文字母或数字的字符串,和 [a-zA-Z0-9] 语法一样
\w+ 和 [a-zA-Z0-9]+ 语法一样
\W 非英文字母或数字的字符串,和 [^a-zA-Z0-9] 语法一样
\W+ 和 [^a-zA-Z0-9]+ 语法一样
\s 空格,和 [\n\t\r\f] 语法一样
\s+ 和 [\n\t\r\f]+ 一样
\S 非空格,和 [^\n\t\r\f] 语法一样
\S+ 和 [^\n\t\r\f]+ 语法一样
\b 匹配以英文字母,数字为边界的字符串
\B 匹配不以英文字母,数值为边界的字符串
a|b|c 匹配符合a字符 或是b字符 或是c字符 的字符串
abc 匹配含有 abc 的字符串
(pattern) () 这个符号会记住所找寻到的字符串,是一个很实用的语法。第一个 () 内所找到的字符串变成 $1 这个变量或是 \1 变量,第二个 () 内所找到的字符串变成 $2 这个变量或是 \2 变量,以此类推下去。
/pattern/i i 这个参数表示忽略英文大小写,也就是在匹配字符串的时候,不考虑英文的大小写问题。
\ 如果要在 pattern 模式中找寻一个特殊字符,如 "*",则要在这个字符前加上 \ 符号,这样才会让特殊字符失效

*?  +?   ??  为这三个数量词的非贪婪的类型

 perl中的扩展模式匹配

/pattern(?=string)/ 肯定和否定的见匹配?=和?-,这个在(?=)中的内容不会存到$&中

perl处理完后会给匹配到的值存在三个特殊变量名

$&, $`, $’。匹配上的那部分字符串将自动存储在$&之中.变量$1 中的值为 there,而$&为整个被匹配的部分,匹配部分的前一部分存放在$`之中,后一部分被存到$’。另一种说法是,$`中含有正则表达式引擎在匹配 成功前所找到的变量,而$’为此模式还没有匹配的剩余部分。如果将这三个变量放在一起,你将得到原始字符串

括号的特殊用法

(?#text) 忽略括号内的注释文本;
(?:pattern) 与组一致,但匹配时不生成$1,$2,也就是不捕获;
(?imsx:pattern) 与组一致,但匹配时不生成$1,$2,在特定的风格有效期间,内嵌风格匹配修饰符;
(?=pattern) 前看声明,如果正则表达式在下一次匹配 pattern 风格,就开始匹配,而且不影响匹配效果。如/\w+(?=\t)/将匹配制表符是否恰好在一个字\w+后面出现,并且制表符不添加到$&的值中;
(?!pattern) 如果正则表达式在后面不匹配 pattern ,才会开始匹配。如/foo(?!bar)/,只有当出现 foo,并且后面不出现 bar 时才开始匹配;
(?<=pattern) 后看声明,只有在pattern已经匹配下面的表达式,并且不将 pattern 的结果放入$&变量中,才匹配下面的语句。如/(?<=\t)\W+/匹配制表符是否恰好在\W+前出现,但又不将制表符送到$& 中;
(? (?{code}) 表示对 code 的使用是试验性的。如果返回真,就认为是与(?:pattern)断言同一行里的匹配。code 不插入变量。这个断言仅仅在 use re ‘eval’ 编译指示符时才有效;
(?>pattern) 如果类型锁定在当前位置,就使用单独的 pattern 匹配子字符串。如正则表达式/^(?>a*)ab/永远不会匹配,因为语句(?>a*)将匹配字符串开头所有的 a 字符,并删除与 ab 匹配的字符 a;
(!<=pattern) 非后看声明,与后看声明意思相反;
(!=pattern) 非前看声明,与前看声明意思相反;
(?(condition)yes-pattern|no-pattern) 条件表达式——条件语句或者是一个圆括号中的整数,或者是一个断言;
(?(condition)yes-pattern)
(?imsx) 嵌入风格匹配修饰符。当要把表达式修改符嵌入在变量中,然后把变量用在不指定自己的修饰符的一般规则表达式中;
(?-imsx) 这个断言很有用——后面带任何内容都会关闭修饰符,直到出现另一个嵌入的修饰符。

Perl 中特殊正则元字符使用和环顾断言:

1. *? 和 +? 和 {n,}?  懒惰匹配
非懒惰                

echo "ab2c121a" |perl -ne 'print $1 if /(.*)"d/;'   #print ab2c12

懒惰

echo "ab2c121a" |perl -ne 'print $1 if /(.*?)"d/;'   #print ab

2.回溯引用和前后查找:
向前查找(?=..)  找字符串前面的内容,找到算成立             

echo "ab2c121a" |perl -ne 'print $1 if /(.*?)(?=2)/;'  #print ab

向后查找(?<=..)  找字符串后面的内容,找到算成立          

echo "ab2c121a" |perl -ne 'print $1 if /(?<=2)(.*)(?=2)/;' #print c1

负向-前/后 查找 (?!…)(?<!..)   找字符串前后的内容,如果不存在为真

echo "ab2c121a" |perl -ne 'print $1 if /(?

向前和向后的分别在于,是找当前字符的前面还是后面的部分.如上ab2c121a ,比如在2c的前面是ab后面是121a.
负向的前后查找主要在于,条件不一样,上面是找到为真,但负向是没有找到为真.

条件?() = if ?()| = if else
?()例如<p></p>必须同时出现

echo "xx"|perl -ne 'print $2  if /()?("w*)(?(1)<"/p>)/'   #print  xx echo "xx"|perl -ne 'print $2,""n" if /()?("w*)(?(1)<"/p>)/'    #print 空 echo "xx"|perl -ne 'print $2 if /()?("w*)(?(1)<"/p>)/'    #print xx

?()|例如还是上面的, 当有<p>可以接</p>也可以接数字结尾

 echo "xx1"|perl -ne 'print $2  if /()?("w*)(?(1)<"/p>|"d)/'  #print xx1  echo "xx1"|perl -ne 'print $2  if /()?("w*)(?(1)<"/p>|"d)/'    # print xx

可选的修饰符

有几个修饰符,通常叫做标记,可以后缀在正则表达式后面来改变其默认的行为。
/i :不区分大小写
/s :匹配任何字符. 例如: 点(.)不匹配换行符,如果加上/s这个修饰符,它将点(.)的行为变成同字符类[\d\D]的行为类似,可以匹配任何字符,包括换行符。
/x :添加空格. /x修饰符允许你在模式中加入任何数量的空白,以方便阅读.      
例如: (/-? \d+ \.? \d* /x) 等同于 (/-?\d+\.?\d*/)
将可选修饰符结合起来,其顺序是不重要的。 例如 (/barney.*fred/is)

Perl 正则的优化

(1  使用 /o 来优化要多次运行但不修改的表达示
(2  使用 qr 在运行前编译要多次运行的正则表达示
(3  短字符用 /aaa/ || /bbb/ || /ccc/分割比 /aaa|bbb|ccc/ 速度快
( 4  试着用 study  模式来学习正则

判断当前位置的前后字符,是否符合指定的条件,但不匹配前后的字符。


说明

预搜索有向前和向后两种:

表达式

方向

说明

(?=xxx)

正向预搜索(向右)

正向预搜索,判断当前位置右侧是否能匹配指定表达式

(?!xxx)

正向预搜索否定,判断当前位置右侧是否不能够匹配指定表达式

(?<=xxx)

反向预搜索(向左)

反向预搜索,判断当前位置左侧是否能够匹配指定表达式

(?<!xxx)

反向预搜索否定,判断当前位置左侧是否不能够匹配指定表达式

正向预搜索内部的表达式,始终采用“普通模式(从左向右)”模式,反向预搜索内部的表达式,始终采用 “从右向左”模式。

例如:想要匹配字符a但不匹配abc,可以为/a(?!bc)/
再如:想要所有以.pl结尾但不是a.pl的文件名,可以/.*(?<!a)\.pl/; 注意要从右向左,

强大的Perl中的正则相关推荐

  1. Perl中的正则表达式

    转自:http://c20031776.blog.163.com/blog/static/684716252013624383887/ Perl 程序中,正则表达式有三种存在形式 分别是 (1 模式匹 ...

  2. perl中正则匹配中文字符

    写下这个题目,首先要区分的是,不是在perl的正则中找到中文,那样只要根据字符集的范围就可以找到,而是要找到给定中文字符串中是否包括指定的字词,比如,当下的某个系统中需要过滤 不厚先生的 名字. 通常 ...

  3. 在perl中简单的正则匹配

    (一).在perl中关于元字符的匹配 元字符 代表含义 点号( .) 匹配处换行符以外的任何单字符 星号(*) 匹配前面的内容零次或多次 反斜线 屏蔽元字符的特殊含义.\\代表\,\.匹配点号 .* ...

  4. perl中unicode属性

    http://shouce.jb51.net/perl/PatternMatching.html 第五章 模式匹配 第五章 模式匹配 5.1 正则表达式箴言 5.2 模式匹配操作符 5.2.1 模式修 ...

  5. oracle中sql 正则怎么写?

    文章目录 在Oracle 10g及以下版本中,可以使用POSIX扩展来进行正则匹配 Oracle 11g及以上版本 是否走索引 Oracle中使用正则表达式需先使用REGEXP_LIKE函数来匹配字符 ...

  6. perl-regexp_使用Regexp :: Common在Perl中轻松进行数据验证

    perl-regexp 在Perl中构建正则表达式可能会有些棘手,特别是对于新手而言. 这是一项强大的技术,但是即使是经验丰富的Perl开发人员有时也会发现自己在检查文档以确保他们做对了. 正则表达式 ...

  7. 在 Perl 中使用 Getopt::Long 模块来接收用户命令行参数

    我们在linux常常用到一个程序需要加入参数,现在了解一下 perl 中的有关控制参数的模块 Getopt::Long ,比直接使用 @ARGV 的数组强大多了.我想大家知道在 Linux 中有的参数 ...

  8. 在 Perl 中利用 DOM 和 XPath 对 XML 进行有效处理

    文在对几个大型 XML 项目进行分析的基础上研究了如何有效且高效地使用 DOM.开发人员兼作者 Tony Daruger 提供了一组用法样式和一个函数库,以使 DOM 强壮和易用.虽然 DOM 提供了 ...

  9. python re subn_python中的正则re.sub re.subn

    这次给大家带来python中的正则re.sub & re.subn,使用python中正则re.sub & re.subn的注意事项有哪些,下面就是实战案例,一起来看一下. Pytho ...

最新文章

  1. 14、Kubernetes持久化存储
  2. hdu 3501 欧拉函数
  3. sonar 规则之漏洞类型
  4. 基于SU的快速傅里叶变换(FFT)
  5. java 泛型 接口_Java泛型(泛型接口、泛型类、泛型方法)
  6. 字符串匹配——C++使用Regex
  7. 通过 PC 远程控制 Android 的应用 -- 可以将手机屏幕投射显示到电脑上
  8. 【OpenCV 例程 300 篇】101. 自适应中值滤波器
  9. Ubuntu 16.04 安装 NVIDIA GeForce GTX 1060 显卡驱动,以及 CUDA 10.1
  10. tdr 定位公式_时域反射计TDR原理详细解析
  11. chisel 仲裁器Arbiter和队列Queue(ready-valid接口)
  12. 人类社会——为什么要有秩序
  13. Linux云计算机构-防盗防击防破解三大工具:webshell、ddos-deflate、Medusa
  14. python type help copyright_python中help信息
  15. 用矿卡P106升级tensorflow深度学习服务器
  16. linux qq x64,QQ Linux 版时隔多年再次更新,支持 x64、ARM64 等多种架构
  17. 使用java计算数组方差和标准差
  18. ArduinoMega2560 引脚表
  19. Nand Flash基础知识
  20. 打印机无法打印,配置端口显示错误?

热门文章

  1. AJPFX关于多态的应用
  2. 中国人自己的框架——蚂蚁金服RPC框架结构分析
  3. Comparable和Comparator的区别
  4. 《计算机图形学》2.2.2 光栅扫描显示处理器
  5. 利用 CocoaLumberjack 搭建自己的 Log 系统
  6. 八杯水微博程序演示及下载
  7. Win2003 + SQL 2005 做数据库集群总结(虚拟机)
  8. 不重新编译DLL,让FCKEditor支持附件上传
  9. php实现解压功能的函数
  10. java hasmoreelements_Java IOException.hasMoreElements方法代码示例