正则规则摘要
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
scat
tered 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 cap
tain wore his cap
and cap
e 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. 子表达式
使用()
表示子表达式
例如,匹配连续的
字符:
使用/ {2,}/
只能匹配 ;;;;;
,使用子表达式/( ){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']