正则规则摘要

1. 单字符匹配规则

  • *: 匹配 0 个或者多个(可有可无)

  • +: 匹配一个或者多个(至少一个)

  • ?: 匹配 0 个或者一个(至多一个)

// 至多一个s,可以没有s,可以有一个s
/https?/;

// 等同于:(更语义化)
/http[s]?/;
  • {m,n}:匹配 n-m 个

  • {m,}:匹配 至少 m 个

  • {1,n}:匹配至少 1 个 至多 n 个

  • {0,n}:匹配至多 n 个

1.1 贪婪型(greedy)与懒惰型(lazy)量词

贪婪型量词懒惰型量词
**?
++?
{n,}{n,}?

匹配文本<b>AK</b> and <b>Hi</b>中 b 标签:

使用/<[Bb]>.*<\/[Bb]>/会匹配出两个 b 标签<b>AK</b> and <b>Hi</b>

使用/<[Bb]>.*?<\/[Bb]>/会匹配出 1 个 b 标签<b>AK</b>

// 使用/<[Bb]>.*<\/[Bb]>/匹配的结果
`<b>AK</b> and <b>Hi</b>`.match(/<[Bb]>.*<\/[Bb]>/);
// ['<b>AK</b> and <b>Hi</b>', index: 0, input: '<b>AK</b> and <b>Hi</b>', groups: undefined]

// 使用/<[Bb]>.*?<\/[Bb]>/匹配的结果
`<b>AK</b> and <b>Hi</b>`.match(/<[Bb]>.*?<\/[Bb]>/);
// ['<b>AK</b>', index: 0, input: '<b>AK</b> and <b>Hi</b>', groups: undefined]

2. 匹配字符

2.1 匹配数字

[0-9]: 匹配数字 0-9

/d: 匹配数字 0-9

/D: 匹配除了数字 0-9 的字符

2.2 匹配字母

[a-z]:匹配小写字母 a-z

[A-Z]:匹配大写字母 A-Z

[a-zA-Z]:匹配大小写字母 A-Z

[a-zA-Z]: 匹配任何一个非大小写字母 A-Z,等价于[^a-zA-Z]

注意:[A-z]并不能简单表达为大小写字母,因为 ASCII 码 A-z 中还有包括[ ^等字符

2.3 匹配字母数字下划线

\w:匹配一个单字字符(字母、数字或者下划线),等价于 [A-Za-z0-9_]

\W:匹配一个单字字符(非字母、数字或者下划线),等价于 [^A-Za-z0-9_]

2.4 匹配所有字符(除了换行符外)

.:除了换行外的任何字符

2.5 匹配空白字符

/s: 匹配任何一个空白字符,等价于[\f\n\r\t\v]

/S: 匹配任何一个非空白字符,等价于[^\f\n\r\t\v]

3. 边界

3.1 单词边界

\b:表示一边是\w(字母数字下划线)另一边是\W(非字母数字下划线)的内容

the cat scattered his food all over the room

/cat/可以匹配 the cat scattered his food all over the room

/\bcat\b/可以匹配 the cat scattered his food all over the room

The captain wore his cap and cape proudly ashe sat listening to the recap of how

/\bcap/可以匹配 The captain wore his cap and cape proudly ashe sat listening to the recap of how

/cap\b/可以匹配 The captain wore his cap and cape proudly ashe sat listening to the recap of how

\B:表示匹配非单词的边界的(大写 B 与\b相反)

Please enter the nine-digit id as itappears on your color - coded pass-key

/\B-\B/可以匹配 Please enter the nine-digit id as itappears on your color - coded pass-key

但是无法匹配nine-digit中的-

3.2 字符串边界

^匹配字符串起始位置

^只有在出现在字符集合里面[^]且紧跟左括号[的后面才表示排除该字符集合,例[^0-9]排除0-9

$匹配字符串结束位置

在多行模式下,如后面加m开启多行模式,开启后,换行符将视为字符串分隔符

^匹配字符串起始位置,也可以匹配换行符之后的起始位置(新行)

$匹配字符串结束位置,也可以匹配换行符之后的结束位置(新行)

例子-匹配 js 注释的正则:

`
// 注释1
const testCodeStr ="1111"

// 注释2
const testCodeStr2 ="2222"

`.match(/^\s*\/\/.*$/gm);

// 结果匹配两个注释:['\n// 注释1', '\n// 注释2']

4. 子表达式

使用()表示子表达式

例如,匹配连续的&nbsp;字符:

使用/&nbsp;{2,}/只能匹配&nbsp;;;;;;,使用子表达式/(&nbsp;){2,}/可以匹配。

例如,匹配连 IP 地址192.168.1.1:

/(\d{1,3}\.){3}(\d{1,3})/

更精确的正则:

1.匹配 251-255 (25[0-5])

2.匹配 200-249 (2[0-4]\d)

3.匹配 100-199 (1\d{2})

4.匹配 0-99 (d{1,2})

(((25[0-5])|(2[0-4]\d)|(1\d{2})|(d{1,2}))\.){3}((25[0-5])|(2[0-4]\d)|(1\d{2})|(d{1,2}))

5. 反向引用

5.1 反向引用匹配

使用正则/<[Hh]([1-6])>.*?<\/[Hh]\1>/g匹配 h1-h6 标签

<BODY>
<H1>Welcometomy Homepage</H1>
Content is divided into two sections:<BR>
<H2>ColdFusion</H2>
Information about Macromedia ColdFusion.
<H2>Wireless</H2>
Information about Bluetooth,802.11,and more.
<H2>Thisisnot valid HTML</H3>
</BODY>

结果为:

["<H1>Welcometomy Homepage</H1>", "<H2>ColdFusion</H2>", "<H2>Wireless</H2>"];

5.2 反向引用替换

将邮箱换成可点击$1为匹配之后的结果

`Hello,ben@forta.com is my email address`.replace(
  /(\w+[\w\.]*@[\w\.]+\.\w+)/g,
  '<a href="mailto:$1">$1</a>'
);
// 结果为:
`Hello,<a href="mailto:ben@forta.com">ben@forta.com</a> is my email address`;
// 电话号码`313-555-1234`转化为`(313)555-1234`
313 - 555 - 1234;
248 - 555 - 9999;
810 - 555 - 9000;

`313-555-1234`.replace(/(\d{3})(-)(\d{3})(-)(\d{4})/, `($1)$3-$5`);
// 结果为:
// '(313)555-1234'

5.3 大小写转换的元字符

元字符说明
\E结束\L\U转换
\l把下一个字符转换为小写
\L\L\U之间的字符全部转换为小写把
\u下一个字符转换为大写
\U\U\E之间的字符全部转换为大写

6.环视

6.1 向前查看?=

使用?=向前查看,不消耗该字符

使用?!向前查看否定,不消耗该字符

// 匹配`http`,使用正则`/.+(?=:)/`
`http://www.forta.com/`.match(/.+(?=:)/);

// 结果为:
// ['http', index: 0, input: 'http://www.forta.com/', groups: undefined]

6.2 向后查看?<=

与向前查看?=的差别,包含文本指向后方箭头<就是向后查看

// 匹配价格($后面的内容):
`手机:$999.99  电脑:$8888.88`.match(/(?<=\$)[0-9.]+/g);

// 结果为:
// ['999.99', '8888.88']
Contributors: masecho