JavaScript 正则表达式:特殊字符以及范围语法 [...] 中那些不需要转义的特殊字符

444 阅读1分钟

本文参考了 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. 不在开头的尖尖号 ^

比如下面的写法,就是冗余的:

"1 + 2 - 3".match(/[\-\(\)\.\^\+]/g)
// ['+', '-']

完全可以简写成:

"1 + 2 - 3".match(/[-().^+]/g)
// ['+', '-']

总结

本文介绍了 JS 正则表达式中的特殊字符相关的知识。突然感觉到,JS 正则表达式虽然强大,但有时确实挺难读的,简洁也会带来一些理解和学习成本。

感谢你的阅读,Happy Coding!