正则表达式
正则表达式创建
// 方法一, 通过`/``/`之间写入表达式
var re = /ab+c/
// 方法二,通过对象 RegExp创建, 第一个参数是字符串表达式,后一个参数是标志,参考后文
var re = new RegExp("ab+c", "flags")
// 如果正则表达式不变,一般用第一种,如果正则表达式会根据程序运行动态改变,就要用第二种。
// 通过字符串表达式创建的正则,需要转义的字符有以下几个
// [ ] \ ^ $ . | ? * + ( )
表达式的方法
exec
返回[...匹配数据],用法:reg.exec(str)
/d(b+)d/g.exec('cdbbdbsbz')
输出:[ "dbbd" ]
match
返回[匹配数据、捕获数据、索引、输入],用法:reg.match(str)
/d(b+)d/g.match('cdbbdbsbz')
输出:[ "dbbd" ]
test
返回布尔值,用法:reg.test(str)
/d(b+)d/g.test('cdbbdbsbz')
输出:true
matchAll TODO
返回一个迭代器,其他暂时没了解过
search
返回匹配索引,未匹配到返回-1,用法:str.search(reg)
'cdbbdbsbz'.search(/d(b+)d/g)
输出:1
replace
替换匹配数据,用法:str.replace(reg, replace)
'cdbbdbsbz'.replace(/d(b+)d/g, '换')
输出:'c换bsbz'
split
根据规格分割数据,用法:str.split(reg)
'cdbbdbsbz'.split(/db+d/g)
输出:['c', 'bsbz']
特殊字符表
断言类
^
: 匹配输入的开头$
: 匹配输入的结尾\b
: 匹配「单词」和「非单词」边界\B
: 匹配同类的边界,即「单词」与「单词」之间,「非单词」与「非单词」之间的边界x(?=y)
: 向前断言,匹配x
被y
跟随x(?!y)
: 向前否定断言,匹配x
不被y
跟随(?<=y)x
: 向后断言,匹配x
跟随y
(?<!y)x
: 向后否定断言,匹配x
不跟随y
PS:「单词」边界中的「单词」在js中指的是
\w
,即[a-zA-Z0-9_],除此之外称为「非单词」
字符类
.
: 匹配除了终止符之外的任何单个字符\d
: 匹配任何阿拉伯数字。相当于[0-9]
\D
: 匹配非\d
。相当于[^0-9]
\w
: 匹配基本拉丁字母中的数字字符,相当于[A-Za-z0-9_]
\W
: 匹配非\w
,相当于[^A-Za-z0-9_]
\s
: 匹配空白字符,包含以下几个,相当于[\f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
:- 空格符 (space character)
- 制表符 (tab character)
- 回车符 (carriage return character)
- 换行符 (new line character)
- 垂直换行符 (vertical tab character)
- 换页符 (form feed character)
\S
: 匹配非\s
,相当于[^\f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
\t
: 匹配制表符 (tab character)
\r
: 匹配回车符 (carriage return character)
\n
: 匹配换行符 (new line character)
\v
: 匹配垂直换行符 (vertical tab character)
\f
: 匹配换页符 (form feed character)
[\b]
: 匹配退格符(backspace)
\0
: 匹配 NULL 字符\xhh
: 匹配两位十六进制数\uhhhh
: 匹配四位十六进制,Unicode字符
组和范围
x|y
: 匹配x
或y
字符[xyzA-Z]
: 匹配A
到Z
的字符集合xyz
三个字符,其中-
为连字符,如果放在开头或结尾将作为普通字符匹配[^xyzA-Z]
: 匹配除[xyzA-Z]
以外的字符(x)
: 捕获组,匹配x
并记住x
\n
:n
是正整数,引用之前的捕获,例如:/abc(d)ef\1/
匹配abcdefg
,得到abcdefd
量词
x*
: 将x
匹配0次以上x+
: 将x
匹配1次以上x?
: 将x
匹配0次或1次x{n}
: 将x
匹配n
次x{n,}
: 将x
匹配n
次以上x{n,m}
: 将x
匹配n
次以上,m
次以下x*?, x+?, x??, x{n}?, x{n,}?, x{n,m}?
: 原本x*, x+, x?, x{n}, x{n,}, x{n,m}
匹配的是「贪婪」的,后面加上?
之后,匹配将变成「非贪婪」
PS:「贪婪」表示全部匹配,「非贪婪」表示只匹配一次
正则表达式标志
正则表达式有六个可选参数 (flags) 允许全局和不分大小写搜索等。这些参数既可以单独使用也能以任意顺序一起使用, 并且被包含在正则表达式实例中
g
: 全局搜索i
: 不区分大小写搜索m
: 多行搜索s
: 允许.
匹配换行符u
: 使用unicode码的模式进行匹配y
: 执行“粘性(sticky)”搜索,匹配从目标字符串的当前位置开始