正则表达式
正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
简单字符
没有特殊意义的字符都是简单字符
转义字符
\
是转义字符
下面是常用转义字符列表:
字符集和
[abc]
# 匹配a或b或c
如果要表示字符很多,可以使用-表示一个范围内的字符,下面两个功能相同
[0123456789]
[0-9]
在前面添加^,可表示非的意思,下面的代码能够匹配abc之外的任意字符
[^abc]
其实正则还内置了一些字符集,在上面的转义字符有提到,下面给出内置字符集对应的自定义字符集
.
匹配除了换行符(\n
)以外的任意一个字符 =[^\n]
\w = [0-9a-Z_]
\W = [^0-9a-Z_]
\s = [ \t\n\v]
\S = [^ \t\n\v]
\d = [0-9]
\D = [^0-9]
量词
{n} 匹配 n 次,比如 a{2},匹配 aa
{m, n} 匹配 m 到 n 次,比如 a{1, 3},可以匹配 aaa、aa、a
{m,} 匹配 m 到 ∞ 次,比如 a{1,},可以匹配 aaaa...
? 匹配 0 次或 1 次,相当于
+ 匹配 1 - n 次,相当于
* 匹配 0 到 n 次,相当于
正则默认和人心一样是贪婪的,也就是常说的贪婪模式,凡是表示范围的量词,都优先匹配上限而不是下限
a{1, 3} // 匹配字符串'aaa'的话,会匹配aaa而不是a
有时候这不是我们想要的结果,可以在量词后面加上?,就可以开启非贪婪模式
a{1, 3}? // 匹配字符串'aaa'的话,会匹配a而不是aaa
字符边界
^ 在 []
外表示匹配开头的意思
^abc // 可以匹配abc,但是不能匹配aabc
$ 表示匹配结尾的意思
abc$ // 可以匹配abc,但是不能匹配abcc
\b
表示单词的边界
abc\b // 可以匹配 abc ,但是不能匹配 abcc
\B
表示非单词的边界
abc\B // 可以匹配 abcc, 不能匹配 abc abc
选择表达式
正则中用|来表示分组,a|b表示匹配a或者b的意思
123|456|789 // 匹配 123 或 456 或 789
分组与引用
分组是正则中非常强大的一个功能,可以让上面提到的量词作用于一组字符,而非单个字符,分组的语法是圆括号包裹(xxx)
(abc){2} // 匹配abcabc
分组不能放在 []
中,分组中还可以使用选择表达式
(123|456){2} // 匹配 123123、456456、123456、456123
和分组相关的概念还有一个捕获分组和非捕获分组,分组默认都是捕获的,在分组的(后面添加?:可以让分组变为非捕获分组,非捕获分组可以提高性能和简化逻辑
'123'.match(/(?123)/) // 返回 ['123']
'123'.match(/(123)/) // 返回 ['123', '123']
和分组相关的另一个概念是引用,比如在匹配html标签时,通常希望
引用的语法是\数字,数字代表引用前面第几个捕获分组,注意非捕获分组不能被引用
<([a-z]+)><\/\1> // 可以匹配 `<span></span>` 或 `<div></div>`等
预搜索
如果你想匹配xxx前不能是yyy,或者xxx后不能是yyy,那就要用到预搜索
js只支持先行预搜索,也就是xxx前面必须是yyy,或者xxx前面不能是yyy
(?=1)2 // 可以匹配12,不能匹配22
(?!1)2 // 可有匹配22,不能匹配12
修饰符
默认正则是区分大小写,这可能并不是我们想要的,正则提供了修饰符的功能,修复的语法如下
/xxx/gi // 最后面的g和i就是两个修饰符
g 正则遇到第一个匹配的字符就会结束,加上全局修复符,可以让其匹配到结束
i 正则默认是区分大小写的,i可以忽略大小写
m 正则默认遇到换行符就结束了,不能匹配多行文本,m可以让其匹配多行文本