目录
正则表达式–《正则表达式必知必会》读书笔记
语法汇总
正则表达式 | 说明 |
---|---|
. | 匹配除\n 之外的任意单个字符 |
^ | 匹配输入字符串的开始位置。 ^\d 表示必须以数字开头 |
[^] | ^ 在字符集合内出现时,表示为取非匹配 |
$ | 匹配输入字符串的结束位置。 \d$ 表示必须以数字结束 |
* | 匹配前面的字符或子表达式零次或多次。zo* 能匹配“z”以及“zoo”。等价于{0,} |
+ | 匹配前面的字符或子表达式一次或多次。zo+ 能匹配“zo”以及“zoo”,但不能匹配“z”。等价于{1,} |
? | 匹配前面的字符或子表达式零次或一次。do(es)? 可以匹配“does”或“does”中的“do”。等价于{0,1} |
*?, +?, {n,}? | ? 在贪婪型元字符后出现时表示为懒惰型匹配,尽可能少的匹配 |
{n} | 匹配前面的字符或子表达式n次 |
{n, m} | 匹配前面的字符或子表达式最少n次,最多m次 |
{n,} | 匹配前面的字符或子表达式至少n次 |
[ab] | 匹配多个字符ab中的任一个 |
[0-9] | 匹配0-9中的一个数字 |
[A-Z] | 匹配任一个大写字母 |
[a-z] | 匹配任一个小写字母 |
[a-zA-Z0-9] | 匹配任一个数字或字母 |
\ | 转义(通常是普通变特殊,特殊变普通) |
[\b] | 回退(并删除)一个字符(Backspace键) |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符(Tab键) |
\v | 垂直制表符 |
\d | 匹配任一个数字,等价于[0-9] |
\D | 匹配任一个非数字字符,等价于[^0-9] |
\w | 匹配任一个字母(大小写均可)或数字或下划线,等价于[a-zA-Z0-9_] |
\W | 匹配任一个非字母或非数字或非下划线,等价于[^a-zA-Z0-9_] |
\s | 匹配任一个空白字符,等价于[\f\n\r\t\v], 不包括[\b] |
\S | 匹配任一个非空白字符,等价于[^\f\n\r\t\v], 包括[\b] |
\b | 指定一个单词边界,要匹配一个完整的单词,通常要用一对,前后各一个\b ;只匹配位置,不匹配空白符,匹配出abc ,而不是abc |
\B | 和\b 相反,表示非字间 |
() | 表示子表达式,将() 里的内容当成一个独立的元素来使用 |
正则表达式入门
把必须匹配的情况考虑周全并写出一个匹配结果符合预期的正则表达式很容易,
但把不需要匹配的情况也考虑周全并确保它们都将被排除在匹配结果以外往往要困难得多
匹配字符
使用元字符
元字符大致可以分为二种:
- 一种是用来匹配文本的,比如:
.
- 另一种是正则表达式的语法所要求的,比如:
[]
转义
转义是用来将具有特殊含义的元字符转为普通字符来匹配它们本身
语法: 在元字符前加反斜杠\
进行转义, 例如:\.
, \\
, \[\]
匹配空白字符
元字符 | 说明 |
---|---|
[\b] | 回退(并删除)一个字符(Backspace键) |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符(Tab键) |
\v | 垂直制表符 |
\r\n\r\n
匹配两条记录间的空白行提示:
\r\n
是Windows的文本结束标签
Unix和Linux系统上匹配空白行只使用\n\n
[\r]?\n[\r]?\n
可匹配不同系统上的空白行
特定字符
元字符 | 说明 |
---|---|
\d | 匹配任一个数字,等价于[0-9] |
\D | 匹配任一个非数字字符,等价于[^0-9] |
\w | 匹配任一个字母(大小写均可)或数字或下划线,等价于[a-zA-Z0-9_] |
\W | 匹配任一个非字母或非数字或非下划线,等价于[^a-zA-Z0-9_] |
\s | 匹配任一个空白字符,等价于[\f\n\r\t\v], 不包括[\b] |
\S | 匹配任一个非空白字符,等价于[^\f\n\r\t\v], 包括[\b] |
正则表达式语法区分大小写,通常含义刚好相反
使用POSIX字符类
字符类 | 说明 |
---|---|
[:alnum:] | 匹配任一个字母或数字,等价于[a-zA-Z0-9] |
[:alpha:] | 匹配任一个字母,等价于[a-zA-Z] |
[:blank:] | 匹配空格或制表符,等价于[\t ] |
[:cntrl:] | ASCII控制字符(ASCII 0到31,再加上ASCII 127) |
[:digit:] | 匹配任一个数字,等价于[0-9] |
[:print:] | 匹配任一个可打印的字符 |
[:graph:] | 和[:print:]一样,但不包括空格 |
[:lower:] | 匹配任一个小写字母,等价于[a-z] |
[:punct:] | 既不属于[:alnum:]也不属于[:cntrl:]的任一字符 |
[:space:] | 匹配任一空白字符,包括空格,等价于[ \t\n\v\f\r] |
[:upper:] | 匹配任一大写字母,等价于[A-Z] |
[:xdigit:] | 匹配任一十六进制数字,等价于[a-fA-F0-9] |
JavaScript不支持POSIX字符类
POSIX字符类必须在[::]
内
重复匹配
- 正则表达式真正的威力体现在重复次数匹配方面
- 元字符分为“贪婪型”和“懒惰型”两种
- 在需要防止过度匹配的场合下,请使用“懒惰型” 元字符来构造正则表达式:
*?
,+?
,{n,}?
- 当在字符集内使用像
.
和+
这样的元字符时将被解释为普通字符,不需要被转义–但转义也没有坏处。[\w\.]
和[\w.]
效果一样
匹配一次或多次: +
- 用
+
匹配前面那个字符或字符集合一次或多次(至少一次,不匹配零个字符的情况) - 给字符集加
+
后缀时必须把+
放在字符集合的外面:[0-9]+
是正确的,[0-9+]则不是 +
是一个元字符,如要匹配它自己则需要进行转义:\+
匹配零次或多次: *
- 用
*
匹配前面那个字符或字符集合零次或多次(可有可无的情况):在我前面的字符或字符集合是可选的 - 给字符集加
*
后缀时必须把*
放在字符集合的外面 *
是一个元字符,如要匹配它自己则需要进行转义:\*
匹配零次或一次: ?
- 用
?
匹配前面那个字符或字符集合零次或一次(最多不超过一次) - 和
*
相比,如要匹配某个可能出现也可能不出现的字符或字符集合时,?
是更佳选择https?://
既可以匹配http://
, 也可以匹配https://
,但也仅此而已 - 给字符集加
?
后缀时必须把?
放在字符集合的外面 ?
是一个元字符,如要匹配它自己则需要进行转义:\?
限定匹配的重复次数
- 用
{数字}
来指定重复匹配的次数 - 用
{数字,数字}
来指定重复匹配的最小次数和最大次数 - 用
{数字,}
来表示重复匹配的至少几次 {}
是元字符,如要匹配它自己则需要进行转义:\{\}
防止过度匹配
在使用贪婪型元字符时容易出现过度匹配的情况,由此引入了懒惰型元字符
懒惰型元字符的写法只要给贪婪型元字符加上一个?
后缀即可
贪婪型元字符 | 相应的懒惰型元字符 |
---|---|
* | *? |
+ | +? |
{n,} | {n,}? |
务必根据具体情况来选用“贪婪型”或是“懒惰型”元字符
位置匹配
元字符 | 说明 |
---|---|
\b | 指定一个单词边界,要匹配一个完整的单词,通常要用一对,前后各一个\b ;只匹配位置,不匹配空白符,匹配出abc ,而不是abc |
\B | 和\b 相反,表示非字间 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结束 |
(?m)
表示启用分行匹配模式,必须出现在整个表达式的最前面
并不是所有正则表达式都支持(?m)
子表达式
什么是子表达式
- 子表达式是一个更大的表达式的一部分
- 子表达式被当作一个独立的元素来使用
- 必须用
()
括起来 ()
是元字符,如要匹配它自己则需要进行转义:\(\)
子表达式的嵌套
- 子表达式允许多重嵌套;应该遵循适可而止的原则
- 多重嵌套的子表达式可以构造出功能极其强大的正则表达式
回溯引用
- 回溯引用是指表达式的后半部分引用在前半部分中定义的子表达式(
()
内的内容) - 引用通过
\数字
来实现\1
表示第1个子表达式;\2
表示第2个子表达式;\3
表示第3个;以此类推\0
用来表示整个正则表达式 - 可以把回溯引用想像成变量
例子
表达式:
<[hH]([1-6])>.*?</[hH]\1>
\1
引用前面子表达式([1-6])
内的内容,使前后的H标签保持一致