正则表达式(笔记)
鸣谢:
该笔记整理于deerchao,《
正则表达式30分钟入门教程
》http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html
语言言简意赅。内容精炼。
基础
比起通配符更加精确查找所要查询的字符,如若忽略,
例如:hi,查找到的可能性为HI, Hi, hI, hi也可能为包含其中的单词him , history...
,精准无误得查找hi,则用\bhi\b。(其中\b为正则表达式规定的一个特殊代码,元字符)代表者单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是有空格,标点符号或者换行来分隔,但是\b并不匹配这些单词分隔符中任何一个,它只匹配一个位置。
又如,要查找hi后面不远处跟着一个Lucy,用该用\bhi\b.*\bLucy\b,(其中"."是另一个元字符,匹配除了换行符以外的任意字符)。* 同样是元字符,代表数量。指定* 前面的内容可以连续重复出现任意次,使整个表达式得到匹配。 因此,.*连在一起就以为着 任意数量的不包含换行的字符 \bhi\b.*\bLucy\b 先是一个单词hi然后是任意个字符(但不能换行),最后是Lucy这个单词。
0\d\d-\d\d\d\d\d\d\d\d, 以0开头,然后是两个数字,然后是一个连字号“-”,最后8个数字(也就是中国的电话号码。当然这个例子只能匹配区号为3位)
\d 匹配一位数字 - 不是元字符,只匹配它本身
也有0\d{2}-\d{8}这里的{2}、{8}的意思是前面\d必须重复2 、8 次
综上: \b 单词的开头或结尾,也就是单词的分界处
. 匹配除了换行符以外的任意字符
* 指定前面的内容可以连续重复出现任意次
\d 匹配一位数字
元字符
\s 匹配 任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等
\w 匹配 字符或数字或下划线或汉字等
\ba\w*\b 匹配 以字母a开头的单词
\d+ 匹配 1个或更多连续的数字。(*与+ 不同的是 *有可能是0次, + 重复1次或更多)
\b\w{6}\b 匹配 刚好6个字母的数字或字母的单词
^ 匹配字符串开始
$ 匹配字符串结束
^\d{5,12}$ {5,12}代表重复次数不能少于5次,不能多于12次。必须输入5到12个数字
字符转义
当需要查找元字符本身时,需要使用\来实现转义,例如\. \* \\ (unibetter\.com c:\\windows)
重复
* 重复0次或更多 + 重复1次或更多 ? 重复0次或1次 {n} 重复n次 {n,} 重复n次或更多 {n,m} 重复n到m次
windows\d+ 匹配windows后跟1个或更多数字
^\w+ 匹配一行的第一个单词(或整个字符串的第一个单词)
字符类
[aeiou] 匹配任何一个原音英文
[.?!] 匹配标点符号.或?或!
[0-9] 匹配一位数字 等同于\d
[a-z0-9A-Z_] 等同于\w(只考虑英文的话)
\(?0\d{2}[) -]?\d{8} \(转义( , ?前面出现0次或1次, \d{2}两个数字, [) -]出现)或 或-,任意一个 上面匹配(011)11111111 012-11111111 012 11111111
分枝条件
【相当于或】
0\d{2}-\d{8}|0\d{3}-d{7} 匹配两种以连字号分隔的电话号码 010-12342123 0232-2321234
\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8} 匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔
\d{5}-\d{4}|\d{5} 使用分枝时注意条件顺序,当满足前面条件时不再判断后面。
分组
【用小括号来制定子表达式】
(\d{1,3}\.){3}\d{1,3} 匹配 简单的IP地址, (\d{1,3}\.){3} ,匹配1-3位数字加“.”且重复3次。
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25{0-5}|[01]?\d\d?) 匹配 IP地址
反义
【查找不属于某个能简单定义的字符类的字符】
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x意外的任意字符
[^aeiou] 匹配除了aeiou这几个字母意外的任意字符
\S+ 匹配 不包含空白符的字符
<a[^>]+> 匹配用尖括号括起来的以a开头的字符串
后向引用
【使用小括号制定一个子表达式后,匹配这个子表达式的文本,也就是次分组捕获的内容,可以在表达式或其他程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号。规则:从左到右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推】
【用于重复搜索前面某个分组配额陪的文本, 例如, \1 代表 分组1匹配的文本】
\b(\w+)\b\s+\1\b 匹配 重复单词:go go, kitty kitty, \1 代表第一个括号捕获的内容
(?<Word>\w+)或者把尖括号换为单引号(?'Word'\w+) 实现自定义组名。反向引用时可以使用\k<Word> 或者\k'Word'
\b(?<Word>\w+)\b\s+\k<Word>\b 同上\b(\w+)\b\s+\1\b
捕获
(exp) 匹配exp, 并捕获文本到自动命名的组里
(?<name>exp) 匹配exp, 并捕获文本到名称为name的组里, 也可以写成(?'name'exp)
(?:exp) 匹配exp, 不捕获匹配的文本,也不给此分组分配组号
零宽断言
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释
(?#comment) 这种类型的分组不对增则表达式的处理产生任何影响,用于提供注释让人阅读
零宽断言
【用于查找某些内容,但不包括这些内容,之前或之后的东西】
【类似于\b, ^, $ 那样用于指定一个位置,这个位置应该满足一定的条件,即断言】
(?=exp) 零宽度正预测先行断言, 断言自身出现的位置的后面能匹配表达式exp
\b\w+(?=ing\b) 匹配 以ing结尾的单词的前面部分,除了ing以外的部分,如I'm singing while you're dancing. 匹配到 sing , danc
(?<=exp) 零宽度正回顾后发断言,断言自身出现的位置的前面能匹配表达式exp
(?<=\bre)\w+\b 匹配 以re开头的单词的后半部分,除了re以外的部分,如 reading a book, 匹配到 ading
((?<=\d)\d{3})+\b 对1234567890 进行查找结果是 234567890
(?<=\s)\d+(?=\s) 匹配 以空白符间隔的数字, 再次强调,不包括这些空白符