简单的学习一下正则表达式吧
- 最简单的,比如匹配matrix
- 这样会匹配到所有含有matrix的,比如,matrix67,matrix123等
- \b metacharacter
- 匹配一个位置,代表开头或者结尾
- 比如,
\bmatrix\b
就是匹配单词matrix了
- . 匹配除了换行符外所有的元素
- * 闭包
- 比如
.*
就是匹配所有不包含换行的字符串
- 比如
- + 正闭包
- 比如
.+
就是匹配所有不包含换行的字符串,但必须有一位,不能为空
- 比如
- ? 匹配0次或1次
- \d 匹配一个数字的字符(0,1,2…,9)
0\d\d-\d\d\d\d\d\d\d\d
就是匹配一个电话号码,可以简写为0\d{2}-\d{8}
- \s 匹配任意的空白符,空格,制表符(Tab),换行
- \w 匹配字母,数字,下划线,汉字等
- ^ 匹配字符串的开始
- $ 匹配字符串的结束
^\d{6,9}$
就是匹配所有6~9位的数字
- [] 匹配括号内的字符
[0-9]
就相当于\d[matrix]
匹配m,a,t,r,i,x中的一个字符\(?0\d{2}[) -]?\d{8}
就是匹配一个电话号码
- | 或者
- 上边的匹配电话号码有问题,(011-12345678 这样的也会匹配
- 那么可以这样修改
\(0\d{2}\)\d{8}|0\d{2}[ -]\d{8}
- () 分组
(\d{1,3}\.){3}\d{1,3}
可以是简单的匹配IP地址,可惜,666.666.666.666这样的也会被匹配进去,进一步改写([01]?\d\d?|2[0-4]\d|25[0-5]\.){3}[01]?\d\d?|2[0-4]\d|25[0-5]
比较难想
- 反义:将字母变成大写(好神奇)
- \W 匹配任意不是字母,数字,下划线,汉字的字符
- \S 匹配任意不是空白的字符
- \D 匹配任意不是数字的字符
- \B 匹配任意不是单词开始或结尾的位置
[^matrix]
匹配除了m,a,t,r,i,x以外的其他字符<a[^>]+>
匹配尖括号内,以a开头的字符串
- 使用小括号指定一个子表达式后,这个子表达式的文本可以被后边所用,默认情况下,以每个左括号为标准,从1开始标号
\b(\w+)\b\s+\1\b
表示匹配重复的单词,比如matrix matrix等
- 当然也可以自己指定组名
(?<name>exp)
表示的就是匹配exp的串,名字是name,捕获时候\k<name>
即可
- 上边例子还可以写为
\b(?<word>\w+)\b\s+\k<word>\b
- 上边例子还可以写为
- 零宽断言,用于查找某些特定串的前面或后面的内容
(?=exp)
查找某些串,这些串的尾部是exp,查找结果是匹配的串减去尾部部分,比如\b\w+(?=ing\b)
查找I am singing while you are dancing时,结果为sing和danc(?<=exp)
查找某些串,这些串的头部是exp,查找结果是匹配的串减去头部部分,比如(?<=\bmat)\w+\b
查找I love matrix67 and matrix123是,结果为rix67和rix123- 比如
(?<=\s)\d+(?=\s)
表示空白符间隔的数字
- 负向零宽断言
(?!exp)
表示此位置后面不能匹配exp,比如\d{3}(?!\d)
匹配三位数字,并且这三位数字后面不是数字,比如\b((?!abc)\w)+\b
匹配不包含连续abc的单词(?<!exp)
表示此位置前面不能匹配exp,(?<![a-z])\d{7}
表示前面不是小写字母的7位数字
(?#comment)
添加注释- 贪婪与懒惰
- 当匹配能接受重复的串时,通常是接受最长的串,也就是贪婪匹配,比如
a.*b
是匹配以a为开头,以b为结尾的所有的串,当匹配aabab时,匹配的是aabab - 有时候,我们希望匹配的尽可能短,可以这样
a.*?b
此时再匹配时,就是匹配的aab(0,2)和ab(3,4) *?
重复尽可能少的次数+?
重复一次或更多次,但尽可能少??
重复0次或一次,尽可能少{n,m}?
重复n到m次,尽可能少{n,}
重复至少n次,尽可能少
- 当匹配能接受重复的串时,通常是接受最长的串,也就是贪婪匹配,比如
- 处理选项
IgnoreCase
匹配时不区分大小写Multiline
多行模式,更改^, 的含义,分别在任一行的行首和行尾匹配,在此模式下, 的含义是匹配\n前的位置和字符串结束前的位置Singleline
单行模式,更改.的含义,与每一个字符匹配(包括\n)IgnorePatternWhitespace
忽略空白ExplicitCapture
显式捕获,仅捕获被显式命名的组
- 递归匹配
(?'exp')
把捕获的内容命名为exp,并压入堆栈(?'-exp')
从堆栈上面弹出最后压入的名为exp的内容,如果堆栈本来为空,匹配失败(?(exp)yes|no)
如果堆栈上存在名为exp的内容,匹配yes部分的表达式,否则匹配no部分的表达式(?!)
零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败