创建正则表达式
1 2 3 4 5
| let regExp = /a+/
let regExp = new RegExp('a+')
let regExp = new RegExp(/a+/, 'g')
|
正则标志
标志 |
作用 |
g |
全局匹配 |
y |
粘滞匹配 |
i |
忽略大小写 |
m |
匹配多行 |
g标志返回多个符合正则的匹配结果
1 2
| 'foo bar'.match(/\w+/g) 'foo bar'.match(/\w+/)
|
注意, 未使用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)) console.log(re.lastIndex) console.log(regExp.exec(text)) console.log(re.lastIndex)
regExp = /\w+/ console.log(regExp.exec(text)) console.log(re.lastIndex) console.log(regExp.exec(text)) console.log(re.lastIndex)
|
m标志匹配多行.如果使用m标志,正则表达式中的^和$将匹配每一行的开始与结束(而非整个字符串的开始和结束)
1 2
| 'a\nb\nc'.match(/^\w$/gm) 'a\nb\nc'.match(/^\w$/g)
|
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) console.log(regExp.exec(text)) console.log(regExp.lastIndex) console.log(regExp.exec(text)) console.log(regExp.lastIndex)
|
正则表达式符号
符号 |
匹配 |
示例 |
^ |
匹配开始 |
|
$ |
匹配结束 |
|
* |
匹配前一个表达式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
test
判断正则是否匹配某个字符串,返回Boolean
String对象方法
match
同RegExp.exec
1 2
| abc'.match(/(a)(b)/) // [ 'ab', 'a', 'b', index: 0, input: 'abc' ]
|
search
根据正则搜索字符串, 返回匹配到的索引,未找到返回-1
replace
替换字符
1 2
| 'abc'.replace(/\w{2}/, 'cd') // cdc
|
对于正则中的子字符串,可用 $ + 数字 的格式表示这些子串
1 2 3
| // 颠倒a和b的位置 'abc'.replace(/(a)(b)/, '$2$1') 'bac'
|
split
字符串转数组
1 2
| 'a.b,c'.split(/\.|,/) // [ 'a', 'b', 'c' ]
|
参考
MDN
正则测试