正则基础

推荐的在线学习、编写、测试集成工具: https://regexr.com/

字符类

[] 匹配

[aeiou] 示例:

'glib jocks vex dwarves!'.match(/[aeiou]/g)
// =>
// ["i", "o", "e", "a", "e"]

匹配结果: glib jocks vex dwarves!

^

[^aeiou] 示例:

'glib jocks vex dwarves!'.match(/[^aeiou]/g)
// =>
// ["g", "l", "b", " ", "j", "c", "k", "s", " ", "v", "x", " ", "d", "w", "r", "v", "s", "!"]

匹配结果正好与上一个示例中的互补

- 范围

示例: [a-z] 表示从 a 到 z 范围内的所有小写字母

. 任意字符

注意,. 表示所有字符(字母、数字、符号),除了:换行

\w 词语(word缩写)

等同于: [A-Za-z0-9_]

\W 非词语

等同于: [^A-Za-z0-9_]

\d 数字

等同于: [0-9]

\D 非数字

等同于: [^0-9]

\s 空白符

包括:空格、制表符(Tab)、换行

\S 非空白符

与空白符互补

锚点

^ 起始

示例: /^\d/ 表示以数字开头

$ 结束

示例: /\d$/ 表示以数字结尾

\b 单词边界

示例:

'she sells seashells'.match(/e\b/g)
// =>
// ["e"]
// 来自于 sh[e空格]sells

\B 非单词边界

\b 互补

转义字符

\ 保留字

示例: \\ 以字符串匹配 \

\t Tab

\n 换行

其他

非常见的转译字符:

  • \v 垂直Tab

  • \f

  • \r 回车

  • \0 Null

  • \cI

  • \000 八进制

  • \xFF 十六进制

  • \uFFFF Unicode

  • \u{FFFF} 扩展Unicode

组合

() 捕获分组

示例: /(ha)+/ 匹配重复的 ha

\1 数组引用

示例: /(\w)a\1/ 匹配以a为中间字母的三字叠字词如 dad, hah

(?:) 非捕获分组

依然以分组进行匹配,但不会创建捕获分组。

观望

(?=) 向后匹配

示例:

'1pt 2px 3em 4px'.match(/\d(?=px)/g)
// =>
// ["2", "4"]
// 单位为 px 的两个结果

(?!) 向后反匹配

示例:

'1pt 2px 3em 4px'.match(/\d(?!px)/g)
// =>
// ["1", "3"]
// 单位不为 px 的两个结果

数量及替换

+ 至少出现一次

示例: \d+

* 出现0次或多次

{n,m} 出现n到m次

示例:

  • \d{3} 指定 3 位数字

  • \d{1,3} 可以是 1 - 3 位数字

  • \d{3,} 可以是 3位或更多位数字

? 至多出现一次(0 或 1)

示例: /colou?r/ 匹配 color 和 colour

? 懒匹配

正常情况下,数量匹配是贪婪匹配,尽可能匹配更多。

示例: /b\w+?/ 表示尽可能少的匹配,如beers匹配结果为be

|

示例: b(a|e|i)d

子语句

  • $& 匹配

  • $1 捕获分组

  • $` 前匹配

  • $' 后匹配

  • $$ 转义$符号

  • \n 转义字符

标识

  • i 忽略大小写

  • g 全局搜索

  • m 多行

  • u Unicode

  • y 从上次位置继续并忽略 g 全局搜索

Last updated