正则表达式的引擎分为三种:NFA、DFA、POSIX NFA
JavaScript 使用的是 NFA 的正则表达式引擎,因为只有 NFA 才支持忽略优先量词。至于什么是【忽略优先量词】,往下看就明白了。
字符组简记
- \d = [0-9] - 数字
- \D = [^0-9] - 非数字字符
- \w = [a-zA-Z0-9_] - 单词字符
- \s = [ \f\n\r\t\v] - 空白字符,例如:空格、换行符、制表符(tab)等
- \W & \S - 大家可以自己猜一下
锚点(匹配的是位置)
- ^ - 匹配开头的位置
- $ - 匹配结尾的位置
- \b
- \B
环视(一种比较复杂的锚点)
- (?=...) - 顺序环视
- (?!...) - 否定顺序环视,又叫排除环视
- JS 目前还不支持逆序环视
分组、捕获、条件
- (...) - 用于分组捕获
- (?:...) - 用于分组,但不捕获
- \1,\2 - 用于引用分组捕获的子表达式,\1 就是第一组括号捕捉到的子表达式
- (?<Name>..) - 命名捕获,JS 不支持
- (?>...) - 固化捕获,JS 不支持
- | - 多选结构,类似或(or)的意思
优先量词
- *、+、?、{min, max} - 限制匹配次数(贪婪模式,尽可能多的匹配)
- *?、+?、??、{min, max}? - 忽略优先量词,同样是限制匹配次数,但是尽可能少的匹配
- *+、++、?+、 {min, max}+ - 占有优先量词,恩,反正 JS 不支持
常用正则表达式
// 替换重复单词
'test test'.replace(/([a-z]+)\s+\1/ig, '$1')
// 先来先服务原则,请下面的正则匹配的 $1 是什么值
'Copyright 2003'.match(/^.*([0-9]+)/)
// 答案:3