摘要
本文主要叙述了正则的三种模式、分组以及引用替换。
目录
1.正则的三种模式
正则有三种模式,分别为贪婪模式、非贪婪模式和独占模式。
1.1 贪婪模式
贪婪模式是:尽可能多的去匹配,表示次数的量词默认是贪婪的,
1.2 非贪婪模式
非贪婪模式:尽可能少的去匹配,量词后面加上?
表示非贪婪模式。
1.3 独占模式
独占模式:贪婪模式和非贪婪模式都是要进行回溯,独占模式不需要进行回溯。表示方法为量词后面加上+
。
独占模式性能比较好,可以节约匹配的时间和 CPU 资源,但有些情况下并不能满足需求。
2.正则中的分组
括号在正则中可以用于分组和复用。
2.1 分组
由多个元字符组成某个部分,应该被用作一个整体的时候,可以用括号括起来表示一个整体。被括号括起来的部分看作一个子组,第几个括号就是第几组。
例如:用来匹配日期2021-11-27
可以使用正则(\d{4})-(\d{2})-(\d{2})
来进行匹配。这里面就有三个分组,分别为第一组表示年、第二组表示月、第三组表示日。
存在括号嵌套的情况,可以使用左括号的顺序作为分组的顺序,即第几个左括号就是第几组。
例如((\d{4})-(\d{2})-(\d{2}))
,同样可以用来匹配日期,这里面就存在四组,第一组表示日期,第二组表示年,第三组表示月,第四组表示日。
2.2 不保存子组
当你在正则中使用了括号,就会默认将括号里的内容保存为子组,这样可以为后续使用提供方便。但是某些情况下,仅仅只是想将这部分看作一个整体,后续并不进行复用,这样我们可以在括号中加入?:
来不保存子组,即(?:正则)
.
不保存分组可以理解为:括号只用于把某个部分当成“单个元素”,不分配编号,后面不会再进行这部分的引用。
正则中出现了括号,那么我们就认为,这个子表达式在后续可能会再次被引用,所以不保存子组可以提高正则的性能.
2.2 分组命名
如果想让一个分组不因为括号的增减而导致经常性的进行引用的修改,则可以对此分组进行命名,命名规则:(?P<分组名>正则)
.
3 分组引用和替换
大部分情况下,我们就可以使用 “反斜扛 + 编号”,即 \number
的方式来进行引用,而 JavaScript 中是通过$
编号来引用,如$1
。
编程语言 | 查找 | 替换 |
---|---|---|
Pythen | \number | \number |
Go | 不支持 | 不支持 |
Java | \number | $number |
JavaScript | $number | $number |
PHP | \number | \number |
Ruby | \number | \number |
版权声明
本文原创作者:ereson
博客地址 :https://ereson.github.io/