最近因为某种需要,浅尝了一下浅尝正则表达式 (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)
<.+> 默认贪婪匹配 “任意字符”
<.+?> 懒惰匹配 “任意字符”