创建正则表达式
1
2
3
4
5
|
let regExp = /a+/
// or
let regExp = new RegExp('a+')
// or
let regExp = new RegExp(/a+/, 'g')
|
正则标志
标志 | 作用 |
---|
g | 全局匹配 |
y | 粘滞匹配 |
i | 忽略大小写 |
m | 匹配多行 |
g标志返回多个符合正则的匹配结果
1
2
|
'foo bar'.match(/\w+/g)// [ 'foo', 'bar' ]
'foo bar'.match(/\w+/) // [ 'foo', index: 0, input: 'foo bar' ]
|
注意, 未使用g标志时,调用RegExp.exec只返回首次匹配结果
1
2
3
4
5
6
7
8
9
10
11
12
|
let regExp = /\w+/g
let text = 'foo bar'
console.log(regExp.exec(text)) // [ 'foo', index: 0, input: 'foo bar' ]
console.log(re.lastIndex) // 3
console.log(regExp.exec(text)) // [ 'bar', index: 4, input: 'foo bar' ]
console.log(re.lastIndex) // 7
// 对比
regExp = /\w+/
console.log(regExp.exec(text)) // [ 'foo', index: 0, input: 'foo bar' ]
console.log(re.lastIndex) // 3
console.log(regExp.exec(text)) // [ 'foo', index: 0, input: 'foo bar' ]
console.log(re.lastIndex) // 3
|
m标志匹配多行.如果使用m标志,正则表达式中的^和$将匹配每一行的开始与结束(而非整个字符串的开始和结束)
1
2
|
'a\nb\nc'.match(/^\w$/gm) // [ 'a', 'b', 'c' ]
'a\nb\nc'.match(/^\w$/g) // null
|
y标志仅在正则对象的lastIndex属性所处位置搜索
1
2
3
4
|
regExp = /b/y
console.log(regExp.exec('abc'))
regExp.lastIndex = 1
console.log(regExp.exec('abc'))
|
部分资料称y匹配失败后不会重置lastIndex属性的说法是错的
1
2
3
4
5
6
7
|
let regExp = /\w+/y
text = 'foo'
console.log(regExp.lastIndex) // 0
console.log(regExp.exec(text)) // [ 'foo', index: 0, input: 'foo bar' ]
console.log(regExp.lastIndex) // 3
console.log(regExp.exec(text)) // null
console.log(regExp.lastIndex) // 0
|
正则表达式符号
符号 | 匹配 | 示例 |
---|
^ | 匹配开始 | |
$ | 匹配结束 | |
* | 匹配前一个表达式0次以上 | |
+ | 匹配前一个表达式1次以上 | |
? | 匹配前一个表达式0/1次,跟在* + ? {} 后表非贪婪(默认贪婪) | |
. | 匹配单个任意字符,换行符除外 | |
() | 捕获括号 | |
(?:) | 非捕获括号 | |
x(?=y) | 正向肯定查找,x后有y时匹配x | /a(?=b)/.exec('abc') // [ 'a', index: 0, input: 'abc' ] |
x(?!y) | 正向否定查找,x后没有y时匹配x | /a(?!c)/.exec('ab') // [ 'a', index: 0, input: 'ab' ] |
(?<=y)x | 反向肯定查找 | /(?<=a)b/.exec('ab') // [ 'b', index: 1, input: 'ab' ] |
(?<!x) | 反向否定查找 | /(?<!c)b/.exec('ab') // [ 'b', index: 1, input: 'ab' ] |
x|y | 匹配x或y | |
{n} | 匹配前一个字符n次 | |
{n, m} | 匹配前一个字符[n, m]次 | |
{n, } | 匹配前一个字符最少n次 | |
[xyz] | 匹配方括号中的任意一个字符.可使用"-"指定一个范围,方括号中的 . 和 * 无特殊意义 | /[a-z]/ /[\u4E00-\u9FFF ]/ |
[^xyz] | 匹配未包含在方括号中的字符 | /[^a-z]/ |
[\b] | 匹配退格 | |
\b | 匹配词的边界(除大小写字母 下划线 数字外的字符都被认为是边界) | |
\B | 匹配非单词边界 | |
\cX | ? | |
\d | 匹配数字 | |
\D | c非数字字符 | |
\f | 匹配换页符 | |
\n | 匹配换行符 | |
\r | 匹配回车符 | |
\s | 匹配空白字符,包括\f \n \r 等 | |
\S | 匹配非空白字符 | |
\t | 匹配制表符(Tab) | |
\v | 匹配垂直制表符 | |
\w | 匹配一个字母/数字/下划线 | |
\W | 匹配一个非字母/数字/下划线的字符 | |
\n | 匹配之前第n个子字符串 | /(a)(b)\1/.exec('aba') // aba |
\0 | 匹配NULL | |
\xhh | 匹配ASCII字符 | |
\uhhhh | 匹配unicode字符 | /\u6211/.exec('我们') // 我 |
\u{hhhh} | (设置u标志时)匹配unicode字符 | /\u{6211}/u.exec('我们') // 我 |
RegExp对象方法
exec
返回数组,包含匹配的字符.未找到匹配则返回null
1
2
|
/(a)(b)/.exec('abc')
// [ 'ab', 'a', 'b', index: 0, input: 'abc' ]
|
test
判断正则是否匹配某个字符串,返回Boolean
1
2
|
/(a)(b)/.test('abc')
// true
|