CodeSnippet
正则表达式

正则表达式

正则表达式速查表

基本匹配

也就是执行普通的匹配,只要匹配出来即可。

"the" => The fat cat sat on the mat.

正则表达式是大小写敏感的,所以要匹配出来的字符串必须和正则表达式完全一致。

点运算

点运算符用于匹配一个字符串中的任意字符。但是不匹配换行符。如 .ar 可以匹配 carbarfar 等。a.r 可以匹配 carbarfar 等。bo.r 可以匹配 borebornbore 等。

".ar" => The car parked in the garage.

字符集

字符集用于指定连字符的范围。如 [abc]ar 可以匹配 carbarfar 等。a[abc]r 可以匹配 carbarfar 等。bo[abc]r 可以匹配 borebornbore 等。字符集中不关心顺序,如 [abc]ar[cba]ar 是一样的。

"[Tt]he" => The fat cat sat on the mat.

与此同时 [.] 就表示匹配一个点号。

"[.]" => The fat cat sat on the mat .

否定字符集

指定不选的字符集。如 [^abc]ar 可以匹配 darearfar 等,但是不匹配 carbaraar 等。

"[^T]he" => The fat cat sat on the mat.

重复次数

+ * ? 用于表示匹配子模式的次数。

*

* 表示匹配前面的子模式零次或多次。如 a* 可以匹配 aaaaaa 等,表示匹配多个以 a 开头的字符串。

"[a-z]*" => The fat cat sat on the mat #21.

T 没有匹配上是因为 T 不在 a-z 范围内。 #21 同理。

* 字符和.字符搭配可以匹配所有的字符.**和表示匹配空格的符号\s连起来用,如表达式\s*cat\s*匹配 0 或更多个空格开头和 0 或更多个空格结尾的 cat 字符串。

"\scat\s" => The fat cat sat on the concatenation.

+

+ 表示匹配前面的子模式一次或多次。如 c.+t 可以匹配 catcadatcadxdcaddt 等,表示匹配以 c 开头,以 t 结尾的字符串,中间可以有任意多个字符。包括空格,但不包括换行符。

"c.+t" => The fat cat sat on the mat.

?

表示在符号前面的字符为可选,即匹配零次或一次。如 colou?r 可以匹配 colorcolour 等,表示匹配 color 或者 colour。

[T]?he => The car is parked in the garage.

{}

用来限定一个或一组字符可以重复出现的次数,[0-9]{2,3} 表示匹配 2 到 3 个数字。

[0-9]{2,3} => The number was 9.9997 but we rounded it off to 10.0.

省略第二个数字表示匹配次数不限,如 [0-9]{2,} 表示匹配 2 个以上的数字。逗号也可以省略,如 [0-9]{2} 表示匹配 2 个数字。

(...) 特征标群

例如, 表达式 (ab)* 匹配连续出现 0 或更多个 ab。如果没有使用 (...) ,那么表达式 ab* 将匹配连续出现 0 或更多个 b 。

我们还可以在 () 中用或字符 | 表示或。例如,(c|g|p)ar 匹配 car 或 gar 或 par.

"(c|g|p)ar" => The car is parked in the garage.

|

| 表示或。例如,c|g|p 匹配 c 或 g 或 p.

特殊字符转码

如果要匹配特殊字符,需要转码。如 . 表示匹配任意字符,如果要匹配 .,需要转码为 \.

"(f|c|m)at." => The fat cat sat on the mat.

锚点

锚点用于匹配字符串的开始和结束。

^

^ 表示匹配字符串的开始。如 ^The 可以匹配 The Theme 等,表示匹配以 The 开头的字符串。

例如,在 abc 中使用表达式 ^a 会得到结果 a。但如果使用 ^b 将匹配不到任何结果。因为在字符串 abc 中并不是以 b 开头。

"^The" => The fat cat sat on the mat.

$

$ 表示匹配字符串的结束。如 at$ 可以匹配 cat bat 等,表示匹配以 at 结尾的字符串。

例如,在 abc 中使用表达式 c$ 会得到结果 abc。但如果使用 b$ 将匹配不到任何结果。因为在字符串 abc 中并不是以 b 结尾。

简写字符集

字符含义
\d匹配一个数字字符。等价于 [0-9]。
\D匹配一个非数字字符。等价于 [^0-9]。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w匹配所有字母数字字符,包括下划线。等价于 [A-Za-z0-9_]。
\W匹配所有非字母数字字符。等价于 [^A-Za-z0-9_]。
\f匹配一个换页符。等价于 \x0c 和 \cL。
\n匹配一个换行符。等价于 \x0a 和 \cJ。
\r匹配一个回车符。等价于 \x0d 和 \cM。
\t匹配一个制表符。等价于 \x09 和 \cI。
\v匹配一个垂直制表符。等价于 \x0b 和 \cK。

标志

标志用于控制正则表达式的匹配方式。

标志含义
i执行对大小写不敏感的匹配。
g执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m执行多行匹配。

/The/gi => The fat cat sat on the mat.

"/.at(.)?$/" => The fat
                cat sat
                on the mat.
# 匹配 mat

贪婪和懒惰

默认情况下,正则表达式是贪婪的,也就是说,它会尽可能多的匹配字符。例如,表达式 a.*b 将会匹配整个字符串 abab,而不是 ab。如果想要匹配尽可能少的字符,可以在 *+ 后面加上 ?,使表达式变成懒惰模式。例如,表达式 a.*?b 将会匹配 ab

贪婪:

/(.*at)/ => The fat cat sat on the mat.

懒惰:

/(.*?at)/ => The fat cat sat on the mat.

示例

匹配邮箱

const email = 'example@foxmail.com';
const reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
console.log(reg.test(email)); // true

匹配 URL

const url = 'https://www.baidu.com';
const reg = /^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+/
console.log(reg.test(url)); // true

匹配手机号

const phone = '13888888888';
const reg = /^1[3|4|5|7|8][0-9]{9}$/
console.log(reg.test(phone)); // true

匹配身份证号

const idCard = '110101199003077777';
const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
console.log(reg.test(idCard)); // true

匹配 IP 地址

const ip = '121.1.1.1';
const reg = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/
console.log(reg.test(ip)); // true

匹配日期

const date = '2020-01-01';
const reg = /^(\d{4})-(\d{2})-(\d{2})$/
console.log(reg.test(date)); // true

匹配 HTML 标签

const html = '<div>hello world</div>';
const reg = /<(\w+)>.*<\/\1>/
console.log(reg.test(html)); // true

匹配中文

const str = '你好,世界';
const reg = /[\u4e00-\u9fa5]/
console.log(reg.test(str)); // true