正则表达式
正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。
搜索模式可用于文本搜索和文本替换。
语法
/正则表达式主体/修饰符(可选)
// 实例 var patt = /runoob/i
/runoob/i |
一个正则表达式 |
runoob |
正则表达式主体 (用于检索) |
i |
一个修饰符 (搜索不区分大小写) |
描述字符(元字符)
元字符是有特殊含义的字符。大部分需要加反斜杠进行标识
元字符 |
描述 |
. |
查找单个字符,除了换行和行结束符 |
\w |
查找单词字符 |
\W |
查找非单词字符 |
\d |
查找数字 |
\D |
查找非数字 |
\s |
查找空白字符 |
\S |
查找非空白字符 |
\b |
匹配单词边界 |
\B |
匹配非单词边界 |
\0 |
查找 NUL字符 |
\n |
查找换行符 |
\f |
查找换页符 |
\r |
查找回车符 |
\t |
查找制表符 |
\v |
查找垂直制表符 |
\xxx |
查找以八进制数 xxxx 规定的字符 |
\xdd |
查找以十六进制数 dd 规定的字符 |
\uxxxx |
查找以十六进制 xxxx规定的 Unicode 字符 |
描述字符范围
在正则表达式语法中,方括号表示字符范围。
- 在方括号中可以包含多个字符,表示匹配其中任意一个字符。
- 如果多个字符的编码顺序是连续的,可以仅指定开头和结尾字符,省略中间字符,仅使用连字符
-
表示。 - 如果在方括号内添加脱字符^前缀,还可以表示范围之外的字符。
范围表达式 |
描述 |
[abc] |
查找方括号内任意一个字符 |
[^abc] |
查找不在方括号内的字符 |
[0-9] |
查找任何从 0 至 9 的数字 |
[a-z] |
查找从小写 a 到小写 z 范围内的字符,即查找小写字母 |
[A-Z] |
查找从大写 A 到大写 Z 范围内的字符,即查找大写字母 |
[A-z] |
查找从大写 A 到小写 z 范围内的字符,即所有大小写的字母 |
() |
分组 |
选择匹配
选择匹配类似于 JavaScript 的逻辑与运算,使用竖线|
描述,表示在两个子模式的匹配结果中任选一个
- (x|y)查找任何以 | 分隔的选项
重复匹配
在正则表达式语法中,定义了一组重复类量词,如表所示。它们定义了重复匹配字符的确数或约数。
量词 |
描述 |
n+ |
匹配任何包含至少一个 n 的字符串 |
n* |
匹配任何包含零个或多个 n 的字符串 |
n? |
匹配任何包含零个或一个 n 的字符串 |
n{x} |
匹配包含 x 个 n 的序列的字符串 |
n{x,y} |
匹配包含最少 x 个、最多 y 个 n 的序列的字符串 |
n{x,} |
匹配包含至少 x 个 n 的序列的字符串 |
使用时
// 量词?表示前面字符或子表达式为可有(一个)可无
匹配'gogle';'ggle'
var r = /go?gle/g; // 等价于 var r = /go{0,1}gle/g;
// 量词*表示前面字符或表达式可以不出现,或者重复出现任意多次
var r = /go*gle/g; // 等价于 var r = /go(0,)gle/g;
// 量词+表示前面字符或子表达式至少出现 1 次,最多重复次数不限
var r = /go+gle/g; // 等价于 var r = /go{1,}gle/g;
惰性匹配
重复类惰性匹配的简单描述如下
{n,m}? |
尽量匹配 n 次,但是为了满足限定条件也可能最多重复 m 次。 |
{n}? |
尽量匹配 n 次。 |
{n,}? |
尽量匹配 n 次,但是为了满足限定条件也可能匹配任意次。 |
?? |
尽量匹配,但是为了满足限定条件也可能最多匹配 1 次,相当于 {0,1}?。 |
+? |
尽量匹配 1 次,但是为了满足限定条件也可能匹配任意次,相当于 {1,}?。 |
*? |
尽量不匹配,但是为了满足限定条件也可能匹配任意次,相当于 {0,}? |
边界量词
边界就是确定匹配模式的位置,如字符串的头部或尾部
边界量词 |
描述 |
^ |
匹配开头,在多行检测中,会匹配一行的开头 |
$ |
匹配结尾,在多行检测中,会匹配一行的结尾 |