字符组
顾名思义,字符组是一组字符,表示在同一位置可能出现的多种字符。语法是在方括号 [ ]
之间列出可能出现的字符。字符组支持 -
范围表示法、^
排除型字符组。
字符组 | 含义 |
---|---|
[ab] | 匹配 a 或 b |
[0-9] | 匹配 0 或 1 或 2 ... 或 9 |
[^ab] | 匹配 除 a、b 任意字符 |
对于常见 [0-9]、[a-z] 等字符组,正则表达式提供简记形式
字符组 | 含义 |
. | 表示 [^\n |
\d | 表示 [0-9],数字字符 |
\D | 表示 [^0-9],非数字字符 |
\w | 表示 [_0-9a-zA-Z],单词字符,注意下划线 |
\W | 表示 [^_0-9a-zA-Z],非单词字符 |
\s | 表示 [ \t\v\n\r\f],空白符 |
\S | 表示 [^ \t\v\n\r\f],非空白符 |
量词
量词也称重复,可以匹配固定或非固定长度字符。其常见形式是 {m,n}
,注意逗号之后绝不能有空格,表示连续出现最少 m 次,最多 n 次。
量词又可分为,匹配优先量词(贪婪量词)、忽略优先量词(惰性量词)。对于不确定是否要匹配时,匹配优先量词会尝试匹配,忽略量词则选择不匹配。
const greedyRe = /\w+/
const lazyRe = /\w+?/
greedyRe.exec('abc')
lazyRe.exec('abc')
匹配优先量词 | 忽略优先量词 | 含义 |
---|---|---|
{m,n} | {m,n}? | 表示至少出现 m 次,至多 n 次 |
{m,} | {m,}? | 表示至少出现 m 次 |
{m} | {m}? | 表示必须出现 m 次,等价 {m,m} |
? | ?? | 等价 {0,1} |
+ | +? | 等价 {1,} |
* | *? | 等价 {0,} |
括号
括号在正则中主要有三种用途:
- 分组,将相关的元素归拢,构成单个元素,可通过
$数字
提取相应顺序分组 - 多选结构,
(...|...)
,规定可能出现的多个子表达式;引用分组,通过\数字
形式引用,即反向引用 - 存储子表达式匹配文本,供之后引用。
分组示例,将 yyyy-mm-dd
时间,替换 mm/dd/yyyy
格式。
const re = /(\d{4})-(\d{2})-(\d{2})/
const str = '2018-01-12'
const result = str.replace(re, '$2/$3/$1')
console.log(result)
// => '01/12/2018'
反向引用匹配成对标签,如<h1>title</h1>
。(注:未考虑标签属性和标签嵌套情形)
const re = /<([a-zA-Z0-9]+)>.*?<\/\1>/
const str = '<h1>title</h1>'
const result = re.test(str)
console.log(result)
// => true
字符 | 含义 |
---|---|
(x) | 捕获括号。匹配 x 并且捕获匹配项。 /(foo)/ 匹配且捕获 "foo bar." 中的 "foo" 。被匹配的子字符串可以通过 元素[n] 中找到,或 RegExp 对象的属性 $n 中找到。会消耗性能,如果需要捕获的数组,可以使用非捕获括号 |
\n | 反向引用(back reference),指向正则表达式中第 n 个括号(从左开始数)中匹配的子字符串。 |
(?:x) | 非捕获括号(non-capturing parentheses)。匹配 x 不会捕获匹配项。匹配项不能够从结果再次访问。(推荐) |
锚点与断言
锚点 | 含义 |
^ | 匹配开头,多行匹配中匹配行开头 |
$ | 匹配结尾,多行匹配中匹配行结尾 |
\b | 单词边界,\w 与 \W 之间位置 |
\B | 非单词边界 |
(?=p) | 该位置后面字符要匹配 p |
(?!p) | 该位置后面字符不匹配 p |
修饰符
修饰符 | 含义 |
i | 不区分大小写匹配 |
m | 允许匹配多 |
g | 执行全局匹配 |