1.概念:
一个正则表达式,就是用某种模式去匹配一类字符串的一个公式。
2.Perl兼容正则表达式
必须记住的几个符号和组合
. 匹配除换行符以外的所有字符一次
? 匹配 0 次或一次
* 匹配 0 次或多次
+ 匹配 1 次或多次
使用范例:
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] 匹配所有非小写字母字符
\b 不属于空白字符,向前缩进一个字符
\d 匹配一个数字的字符,和 [0-9] 语法一样
\w 英文字母或数字的字符,和 [a-zA-Z0-9]+ 语法一样
\s 空格,和 [\n\t\r\f] 语法一样
\B 匹配不以英文字母,数值为边界的字符串
\D 非数字,其他同 \d
\S 非空格,和 [^\n\t\r\f] 语法一样
\W 非英文字母或数字的字符串,和 [^a-zA-Z0-9] 语法一样
a|b|c 匹配符合a字符 或是b字符 或是c字符 的字符串
abc 匹配含有 abc 的字符串
转义: 使用\ 来取消元字符的特殊意义。包括 . * + \ [ ] { } ( ) ^ $
? 的多重定义-懒惰限定符
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
断言匹配: 有4个
(?=exp) 零宽先行断言,它匹配文本中的某些位置,这些位置的后面能匹配给定的后缀exp。
比如\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),
zc:根据后缀匹配而已。和$区别在于$是行尾匹配。
如I'm singing while you're dancing. 它会匹配sing和danc。
(?<=exp) 零宽后行断言,它匹配文本中的某些位置,这些位置的前面能给定的前缀匹配exp。
如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),
zc:匹配前缀。
例如在查找reading a book时,它匹配ading。
(?!exp) 零宽负向先行断言。会匹配后缀exp不存在的位置。
zc: 若不是exp或者没有则匹配,用^在于存在一个不匹配某个exp的其他字符,
而!保证不匹配exp外可以不跟任何字符。
如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字。
也可以是只有前3位数字。比较\d{3}(^\d)有区别.
(?<!exp) 零宽负向后行断言。查找前缀exp不存在的位置.
常用语法:
1,正则里一些特殊字符
() 将表达式结组
[] 寻找一组字符
\d 等于 [0-9]
\D 等于 [^0-9]
\w 等于 [0-9A-Za-z_]
\W 等于 [^0-9A-Za-z_]
\s 等于 [\f\n\r\t ]
\S 等于 [^\f\n\r\t ]
. 等于 [^\n]
2,关于一些特殊符号
\b 不属于空白字符,向前缩进一个字符
\t 属于空白字符,匹配制表符
\r 属于空白字符,匹配回车符
\a 不属于空白字符,匹配闹钟符
\e 不属于空白字符,匹配转义符
\033 不属于空白字符,匹配八进制符
\x1B 不属于空白字符,匹配十六进制符
\c[ 不属于空白字符,匹配控制字符
属于空白字符,匹配空格
属于空白字符,匹配制表符
\f 属于空白字符,匹配换页符
\n 属于空白字符,匹配换行符
\0 不属于空白字符,功能不详
\c 不属于空白字符,功能不详
\x 不属于空白字符,功能不详
3,注意正则里的选择符的特殊性
选择运算符是所有运算符中优先级最低的,这意味着它最后执行。
4,正则里的限定符的一些经典用法
限定符常常与一些字符或词联合使用
* 匹配任意数个;
+ 匹配一个或多个;
? 匹配零个或一个;
{n} 匹配 n 个;
{n,m} 匹配 n 至 m 个;
{n,} 匹配 n 和 n 个以上;
限定符贪婪好像与生俱有的。在缺省状态下,*或+限定符匹配满足正则表达式的一个范式的最大实例数。
可用?号显式的规定限定符的不贪婪。如果问号放在另一个限制符之后(甚至另一个问号之后),都可以使限定符不贪婪。
5,声明与断言
首先注意声明的长度为 0;
Perl种有一组控制大小写和换码的声明:
\u 使下一个字母变大写;
\l 使下一个字母变小写;
\U 使文本的剩余字符变成大写;
\L 使文本的剩余字符变成小写;
\Q 会除字母之外的其他字符进行换码处理,直至遇到 \E 声明、常规表达式结束或者字串结束。
\A声明和脱字符号(^)匹配字串的开始;
\Z声明和美元符号($)匹配字串的结束或刚好在字串结束前的换行符;
\z 只匹配字串的结束;
\b 匹配一个单词(字)边界;
\B 匹配一个非单词(字)边界;
(?#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) 这个断言很有用——后面带任何内容都会关闭修饰符,直到出现另一个嵌入的修饰符。