专门为初学者编写的正则表达式入门教程(4)

专门为初学者编写的正则表达式入门教程

9.2 不区分大小写修饰符(i)

顾名思义,启用这个修饰符会使正则在匹配时不区分大小写。

/#[0-9A-F]{6}/i

专门为初学者编写的正则表达式入门教程

/#[0-9A-F]{6}/

专门为初学者编写的正则表达式入门教程

/#[0-9A-Fa-f]{6}/

专门为初学者编写的正则表达式入门教程

9.3 多行模式修饰符(m)

有限支持

在 Ruby 中,m 修饰符是执行其他的函数。

多行修饰符与正在在处理包含换行符的“多行”字符串时对锚点的处理有关。默认情况下,/^foo$/只匹配 “foo”。

我们可能希望它在多行字符串中的一行也能匹配 foo。

我们拿 "bar\nfoo\nbaz" 举例子:

bar foo baz

如果没有 m 修饰符,上面的字符串会被当做单行 bar\nfoo\nbaz, 正则表达式 ^foo$ 匹配不到任何字符。

如果有 m 修饰符,上面的字符串会被当做 3 行。 ^foo$ 可以匹配到中间那一行。

9.4 Dot-all修饰符 (s)

有限支持

ES2018 之前的 JavaScript 不支持这个修饰符。 Ruby 也不支持这个修饰,而是用 m 表示。

.通常匹配除换行符以外的任何字符。使用dot all修饰符后,它也可以匹配换行符。

10 锚点

锚点本身不匹配任何东西。但是,他们会限制匹配出现的位置。

你可以把锚点当做是 "不可见的字符"。

10.1 行首 ^

在正则开始时插入^ 号,使正则其余部分必须从字符串开始的地方匹配。你可以把它当成始终要在字符串开头匹配一个不可见的字符。

/^p/g

专门为初学者编写的正则表达式入门教程

10.2 行尾

在正则结尾时插入$ 号, 类似于行首符。你可以把它当成始终要在字符串结尾匹配一个不可见的字符。

/p$/g

专门为初学者编写的正则表达式入门教程

^和$锚点经常一起使用,以确保正则和字符串整个匹配,而不仅仅是部分匹配。

/^p$/g

专门为初学者编写的正则表达式入门教程

让我们回顾一下重复中的一个例子,并在正则的末尾添加两个锚点。

/^https?$/g

专门为初学者编写的正则表达式入门教程

如果没有这 2 个锚点, http/2 和 shttp 也会被匹配。

10.3 字边界 \b

字边界是一个字符和非词字符之间的位置。

字边界锚点 \b,匹配字符和非词字符之间存在的假想不可见字符。

/\bp/g

专门为初学者编写的正则表达式入门教程

提示

字符包括 a-z, A-Z, 0-9, 和_.

/\bp\b/g

专门为初学者编写的正则表达式入门教程

/\bcat\b/g

专门为初学者编写的正则表达式入门教程

还有一个非字边界锚 \B。

顾名思义,它匹配除字边界之外的所有内容。

/\Bp/g

专门为初学者编写的正则表达式入门教程

/\Bp\B/g

专门为初学者编写的正则表达式入门教程

小提示

^…$和\b…\b是常见的模式,您几乎总是需要这 2 个防止意外匹配。

10.4 例子

尾部空格

/\s+$/gm

专门为初学者编写的正则表达式入门教程

markdown 标题

/^## /gm

专门为初学者编写的正则表达式入门教程

没有锚点:

/## /gm

专门为初学者编写的正则表达式入门教程

11 零宽断言(lookaround)

零宽断言可用于验证条件,而不匹配任何文本。

你只能看,不能动。

先行断言(lookhead)

正向(?=…)

负向(?!…)

先行断言(lookbehind)

正向(?<=…)

负向(?<!…)

11.1 先行断言(lookhead)

正向(positive)

/_(?=[aeiou])/g

专门为初学者编写的正则表达式入门教程

注意后面的字符是如何不匹配的。可以通过正面前看得到证实。

/(.+)_(?=[aeiou])(?=\1)/g

专门为初学者编写的正则表达式入门教程

正则引擎在 _ 使用了 (?=[aeiou]) 和 (?=\1) 进行检查。

/(?=.*#).*/g

专门为初学者编写的正则表达式入门教程

负向(Negative)

/_(?![aeiou])/g

专门为初学者编写的正则表达式入门教程

/^(?!.*#).*$/g

专门为初学者编写的正则表达式入门教程

如果没有锚点,将匹配每个示例中没有#的部分。

负向的先行断言常常用于防止匹配特定短语。

/foo(?!bar)/g

专门为初学者编写的正则表达式入门教程

/---(?:(?!---).)*---/g

专门为初学者编写的正则表达式入门教程

11.2 例子

密码验证

/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/

专门为初学者编写的正则表达式入门教程

零宽断言可用于验证多个条件。

带引号的字符串

/(['"])(?:(?!\1).)*\1/g

专门为初学者编写的正则表达式入门教程

如果没有先行断言,我们最多只能做到这样:

/(['"])[^'"]*\1/g

专门为初学者编写的正则表达式入门教程

12 进阶例子

JavaScript 注释

/\/\*[\s\S]*?\*\/|\/\/.*/g

专门为初学者编写的正则表达式入门教程

[\s\S]是一种匹配任何字符(包括换行符)的技巧。我们避免使用dot-all 修饰符,因为我们需要使用. 表示单行注释。

24小时时间

/^([01]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?$/g

专门为初学者编写的正则表达式入门教程

IP 地址

/\b(?:(?:2(?:[0-4][0-9]|5[0-5])|[0-1]?[0-9]?[0-9])\.){3}(?:(?:2([0-4][0-9]|5[0-5])|[0-1]?[0-9]?[0-9]))\b/g

专门为初学者编写的正则表达式入门教程

元标签

/<Example source="(.*?)" flags="(.*?)">/gm

专门为初学者编写的正则表达式入门教程

替换: <Example regex={/$1/$2}>

浮点数

可选符号

可选整数部分

可选小数部分

可选指数部分

/^([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?$/g

专门为初学者编写的正则表达式入门教程

正向的先行断言 (?=\.\d|\d) 确保不会匹配 ..

HSL颜色

从0到360的整数

/^0*(?:360|3[0-5]\d|[12]?\d?\d)$/g

专门为初学者编写的正则表达式入门教程

百分比

/^(?:100(?:\.0+)?|\d?\d(?:\.\d+)?)%$/g

专门为初学者编写的正则表达式入门教程

HSL 和 百分比

/^hsl\(\s*0*(?:360|3[0-5]\d|[12]?\d?\d)\s*(?:,\s*0*(?:100(?:\.0+)?|\d?\d(?:\.\d+)?)%\s*){2}\)$/gi

专门为初学者编写的正则表达式入门教程

13 下一步

如果你像进一步学习正则表达式及其工作原理:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwzjxj.html