Perl中的正则表达式
转自:http://c20031776.blog.163.com/blog/static/684716252013624383887/
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 中的值为 $' 中的内容,而 $&
为整个被匹配的部分,匹配部分的前一部分存放在 $` 之中,后一部分被存到 $'.另一种说法是, $` 中含有正则表达式引擎在匹配
成功前所找到的变量,而 $' 为此模式还没有匹配的剩余部分.如果将这三个变量放在一起,你将得到原始字符串
括号的特殊用法
(?#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,}? 懒惰匹配
非懒惰
|
1
|
echo "ab2c121a" |perl -ne 'print $1 if /(.*)"d/;' #print ab2c12 |
懒惰
|
1
|
echo "ab2c121a" |perl -ne 'print $1 if /(.*?)"d/;' #print ab |
2.回溯引用和前后查找:
向前查找(?=..) 找字符串前面的内容,找到算成立
|
1
|
echo "ab2c121a" |perl -ne 'print $1 if /(.*?)(?=2)/;' #print ab |
向后查找(?<=..) 找字符串后面的内容,找到算成立
|
1
|
echo "ab2c121a" |perl -ne 'print $1 if /(?<=2)(.*)(?=2)/;' #print c1 |
负向-前/后 查找 (?!…)(?<!..) 找字符串前后的内容,如果不存在为真
|
1
2
3
|
echo "ab2c121a" |perl -ne 'print $1 if /(?<!--2)(c.*)/;' #print 无echo "ab2c121a" |perl -ne 'print $1 if /(?<!3)(c.*)/;' #print c121a</pre--> |
可选的修饰符
Perl 正则的优化
判断当前位置的前后字符,是否符合指定的条件,但不匹配前后的字符.
说明
预搜索有向前查找和向后查找两种:
表达式
方向
说明
(?=xxx)
正向预搜索(向右)
正向预搜索,判断当前位置右侧是否能匹配指定表达式
(?!xxx)
正向预搜索否定,判断当前位置右侧是否不能够匹配指定表达式
(?<=xxx)
反向预搜索(向左)
反向预搜索,判断当前位置左侧是否能够匹配指定表达式
(?<!xxx)
反向预搜索否定,判断当前位置左侧是否不能够匹配指定表达式
正向预搜索内部的表达式,始终采用“普通模式(从左向右)”模式,反向预搜索内部的表达式,始终采用 “从右向左”模式.
例如:想要匹配字符a但不匹配abc,可以为/a(?!bc)/ 再如:想要所有以.pl结尾但不是a.pl的文件名,可以/.*(?<!a)\.pl/; 注意要从右向左,

Perl中的正则表达式的更多相关文章
- Perl中的正则表达式(五)
正则表达式(Regular Expression),在Perl里边通常也叫做模式(Pattern),用来表示匹配(或不匹配)某个字符串的特征模板. 使用简单模式:若模式匹配的对象是$_的内容,只要把模 ...
- Perl中的正则表达
前几天用到了Perl语言,主要看了一下Perl中的正则表达式,在各种网页语言中,正则表达式在处理字符串的时候十分有用,所以这里就简单说一下在Perl中正则表达式的应用. 先上代码 #!/usr/bin ...
- perl学习之正则表达式
9 Perl 中的正则表达式 正则表达式的三种形式 正则表达式中的常用模式 正则表达式的 8 大原则 正则表达式是 Perl 语言的一大特色,也是 Perl 程序中的一点难点,不过如果大家能够很 ...
- 在vi vim中使用正则表达式与 普通perl正则的区别?
参考这篇文章很好 vim中的正则表达式常用的命令有种, 即搜索和替换 /: 搜索 :s 替换 在vim中的正则表达式和perl编程的正则表达式还是有区别的: 正则表达式中的内容包括: 字面字符... ...
- PHP中有关正则表达式的函数集锦
之前学正则表达式的目的是想从网上抓取点小说啊,文档啊,还有获取相应的视频连接然后批量下载.当时初学PHP根本不知道PHP有专门抓包的工具,就像Simple_html_dom.php(在我的其他博文中有 ...
- JavaScript中的正则表达式(终结篇)
JavaScript中的正则表达式(终结篇) 在之前的几篇文章中,我们了解了正则表达式的基本语法,但那些语法不是针对于某一个特定语言的.这篇博文我们将通过下面几个部分来了解正则表达式在JavaScri ...
- Python::re 模块 -- 在Python中使用正则表达式
前言 这篇文章,并不是对正则表达式的介绍,而是对Python中如何结合re模块使用正则表达式的介绍.文章的侧重点是如何使用re模块在Python语言中使用正则表达式,对于Python表达式的语法和详细 ...
- 解析posix与perl标准的正则表达式区别 ---PHP
正则表达式(Regular Expression,缩写为regexp,regex或regxp),又称正规表达式.正规表示式或常规表达式或正规化表示法或正规表示法,是指一个用 来描述或者匹配一系 ...
- 解析posix与perl标准的正则表达式区别
解析posix与perl标准的正则表达式区别 作者: 字体:[增加 减小] 类型:转载 本篇文章是对posix与perl标准的正则表达式区别进行了详细的分析介绍,需要的朋友参考下 正则表达式(Regu ...
随机推荐
- autofac 初步学习
//数据处理接口 public interface IDal<T> where T : class { void Insert (T model); void Update(T model ...
- js中日历的代码
Html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- memcached 缓存服务器
Memcached 缓存服务器 Memcached 是高性能的分布式内存缓存服务器. 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态web应用的速度.提高可扩展性. 主要特点 ...
- shell的执行顺序问题
&&,||,(),{},& 五个符号的运用 shell脚本执行命令的时候,有时候会依赖于前一个命令是否执行成功.而&&和||就是用来判断前一个命令执行效果的. ...
- 存储过程优点&缺点
存储过程不仅仅适用于大型项目,对于中小型项目,使用存储过程也是非常有必要的.其威力和优势主要体现在: 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一 ...
- ios中的几种多线程实现
iOS 支持多个层次的多线程编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法.下面根据抽象层次从低到高依次列出iOS所支持的多线程编程范式:1, Thread;2, Cocoa ...
- 繁华模拟赛 Evensgn玩序列
#include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...
- dedecms发布文章时多个Tag间分割逗号自动变成英文逗号
dedecms发布文章时经常会添加多个Tag,我们输入汉字时总是喜欢使用全角的逗号,那么有没有办法使用JS脚本把输入的Tag间中文逗号变成英文逗号呢? dedecms发布文章时多个Tag间分割逗号自动 ...
- iphone/ipad图标尺寸
http://www.yixieshi.com/ucd/13759.html APP界面设计规范指导APP设计过程中的设计标准,根据统一的设计标准,使得整个APP在视觉上统一.提高用户对APP的产品认 ...
- sed替换字符串时,使用正则表达式的注意事项
sed的使用方法为: 使用单个模式替换:sed 's/pattern/replacement/flags' filename,例如echo 'abc' | sed 's/a/A/'-->Abc ...