顾名思义,启用这个修饰符会使正则在匹配时不区分大小写。
/#[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 下一步如果你像进一步学习正则表达式及其工作原理: