最近因为某种需要,浅尝了一下浅尝正则表达式 (Regular Expressions),理解起来问题不大,实际使用还是很有难度的,毕竟才接触。
记录两个学习、构建和测试正则式的网站:
其中 regexr-cn.com 的 Github 是 https://github.com/skys215/regexr/
正则常用符号
[]
允许匹配一组可能出现的字符, 如 ‘[pP]thon’ 可以匹配 ‘pthon’、‘Pthon’、‘Ppthon’-
代表区间,比如 [a-z] 可以匹配所有小写字母^
代表非集,[^0-9]
匹配除了数字以外的任何字符\w
与任意单词字符匹配,任意单词字符表示[A-Z]
、[a-z]
、[0-9]
、_
\d
与任意数字匹配\s
快捷方式可以匹配空白字符,比如空格,tab、换行等\b
匹配的是单词的边界,\bmaster\b
就仅匹配有边界的master
单词- 快捷方式也可以取反,例如对于
\w
的取反为\W
^
放在区间外面表示匹配字符串开头$
放在字符串后面表示匹配以字符串结尾的字符串.
字符代表匹配任何单个字符,它只能出现在方括号以外,.
字符只有一个不能匹配的字符,也就是换行符(\n
)?
的作用就是匹配它之前的字符0
次或1
次。- 在一个字符组后加上
{N}
就可以表示在它之前的字符组出现N
次 {M,N}
在一个字符组后面加上重复区间,M
是下界而N
是上界,不写上界则可上界匹配无数个\d{3,4}
既可以匹配3
个数字也可以匹配4
个数字,不过当有4
个数字的时候,优先匹配的是4
个数字,这是因为正则表达式默认是贪婪模式,即尽可能的匹配更多字符,而要使用非贪婪模式,我们要在表达式后面加上?
号,则有 3 个优先匹配 3 个+
等价于{1,}
,*
等价于{0,}
()
一种将表达式分组的机制,当使用分组时,除了获得整个匹配。还能够在匹配中选择每一个分组, 用于提取字符串。|
或者(or)条件,例如要提取所有图片文件的后缀名,可以在各个后缀名之间加上一个|
符号,例:(a|b)
匹配 a 或者 b,(ab)|(cd)
匹配 ab 或者 cd(?: 表达式)
非捕获分组,不需要提取其内容,但是需要将其分离,有分组的特性- 分组的回溯引用,使用
\N
可以引用编号为N
的分组,也就是之前第 N 个分组 - 正向先行断言:
(?=表达式)
,指在某个位置向右看,表示所在位置右侧必须能匹配表达式
- 反向先行断言
(?! 表达式)
的作用是保证右边不能出现某字符 - 正向后行断言:
(?<=表达式)
,指在某个位置向左看,表示所在位置左侧必须能匹配表达式
- 反向后行断言:
(?<! 表达式)
,指在某个位置向左看,表示所在位置左侧不能匹配表达式
限定符(Quantifier)
a*
a 出现 0 次或多次
a+
a 出现 1 次或多次
a?
a 出现 0 次或 1 次
a{6}
a 出现 6 次
a{2,6}
a 出现 2—6 次
a{2,}
a 出现两次以上
字符类(Character Classes)
[abc]
匹配 a 或者 b 或者 c
[a-c]
同上
[a-fA-F0-9]
匹配小写+大写英文字符以及数字
[^0-9]
匹配非数字字符
贪婪/懒惰匹配 (Greedy/Lazy Match)
<.+>
默认贪婪匹配 “任意字符”
<.+?>
懒惰匹配 “任意字符”