「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」。
正则是串用来匹配字符串里特定子串的符号,无论是用来校验用户输入,批量去替换文本内容,都是十分高效的工具。因为正则有其特定的语法,学习起来有一定的难度,所有有一句俗话:当你试图用正则去解决一个问题的时候,你就有了两个问题。
接下来我们来了解一下正则中的一些基本概念。
-
或 | 如JS里面的 || 表示或的意思, gray|grey表示 gray或者grey
-
组()括号里面的内容表示为一组,gray|grey === gr(a|e)y
-
{n}表示出现n次, {n} 花括号表示n次,{min, } 表示min次或者min次以上,{, max}表示max次或者max次一下,{min,max} 表示min、max之间的闭区间
-
? 表示零个或者一个==={0, 1}, *表示任意,零个或者多个=== {0, },+表示至少一个==={1, },
-
[] 表示单个字符,[abc] [a-b]都表示a b 或者c,
[^abc]表示任何不是 a、b或者c的字符
贪婪模式
,+,?默认是贪婪模式,举例, "test", "test1234”",".+" 或者 ". *” 会匹配到整行 "test", "test1234” ,跳过其中的右引号,只到最后一个引号,而加上 ?之后会变成非贪婪模式,当匹配到第一个右引号时结束, "[^"]*" 可以达到同样贪婪的效果。
独占模式
"[^"]*+" 加上一个加号又只会匹配 "test",是因为加上+号,会尽可能多的去匹配当前规则只到失败就结束,阻止回溯,与非贪婪模式不同的是,用?表示的非贪婪模式会尽可能少的匹配当前规则,只到不匹配的时候再回溯,非贪婪跟独占模式很像,相比之下独占模式会比较省时间性能,但也有可能不满足需求。值得注意的是Python跟Go的标准库不支持独占模式,需要安装模块。
回溯:举例 ab{1,3}?c 匹配到 abbc,匹配到ab时因为?尽可能少匹配就用b匹配c,发现不符合时再回头用abb匹配ab{1,3}。而ab{1,3}}+c 则因为一次尽可能多的匹配,匹配到了 abb接下来用c匹配不到b则结束继续用c匹配c。