本文参考了 javascript.info 站点里的相关资料。
学习过 JS 正则表达式的同学应该都知道,在匹配字符的时候,有一些特殊字符在正则中具有特殊含义,需要经过 \ 转义后才能表示匹配那个字符本身,
特殊字符
JS 正则中的特殊字符是:[、]、{、}、(、)、\、^、$、.、|、?、* 和 +,一共 14 个。
这些特殊的字符的含义分别是:
[和]是用来表达字符范围的
"Mop top".match(/[tm]op/gi); // ['Mop', 'top']
{和}是用来表达匹配数量的
// 匹配 5 位数字
"I'm 12345 years old".match(/\d{5}/);
// ['12345', index: 4, input: "I'm 12345 years old", groups: undefined]
+、*和?是{n}的速记写法。+等价于{1,}、*等价于{0,}、?等价于{0,1}(和)是用来标记捕获组的。
"2019-04-30".match(/(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})/)
// ['2019-04-30', '2019', '04', '30', index: 0, input: '2019-04-30', groups: {year: '2019', month: '04', day: '30'}]
^和$称为“锚点(anchors)”,匹配文本的开头和末尾
/^Mary/.test("Mary had a little lamb") // true
/snow$/.test("its fleece was white as snow") // true
// 完整匹配
/^\d\d:\d\d$/.test("12:34") // true
/^\d\d:\d\d$/.test("12:345") // false
.则用来表示任意一个字符(除了换行符)
"Z".match(/./)
// ['Z', index: 0, input: 'Z', groups: undefined]
\用来转义特殊字符时使用
"Chapter 5.1".match(/\d\.\d/)
// ['5.1', index: 8, input: 'Chapter 5.1', groups: undefined]
|用于表示或
"First HTML appeared, then CSS, then JavaScript".match(/html|php|css|java(script)?/gi)
// ['HTML', 'CSS', 'JavaScript']
范围语法 [...] 中那些不需要转义的特殊字符
范围语法 [...] 中有些特殊字无需转义。分别是:
.、+、(和)- 在开头或结尾的连字符
- - 不在开头的尖尖号
^
比如下面的写法,就是冗余的:
"1 + 2 - 3".match(/[\-\(\)\.\^\+]/g)
// ['+', '-']
完全可以简写成:
"1 + 2 - 3".match(/[-().^+]/g)
// ['+', '-']
总结
本文介绍了 JS 正则表达式中的特殊字符相关的知识。突然感觉到,JS 正则表达式虽然强大,但有时确实挺难读的,简洁也会带来一些理解和学习成本。
感谢你的阅读,Happy Coding!