正则表达式进阶
Posted blogging
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式进阶相关的知识,希望对你有一定的参考价值。
捕获组
捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或手动命名的组里,以供后面引用。
表达式 |
说明 |
(Expression) |
普通捕获组,将子表达式Expression匹配的内容保存到以数字编号的组里 |
(?<name> Expression) |
命名捕获组,将子表达式Expression匹配的内容保存到以name命名的组里 |
普通捕获组(在不产生歧义的情况下,简称捕获组)是以数字进行编号的,编号规则是以“(”从左到右出现的顺序,从1开始进行编号。通常情况下,编号为0的组表示整个表达式匹配的内容。
命名捕获组可以通过捕获组名,而不是序号对捕获内容进行引用,提供了更便捷的引用方式,不用关注捕获组的序号,也不用担心表达式部分变更会导致引用错误的捕获组。
非捕获组
一些表达式中,不得不使用( ),但又不需要保存( )中子表达式匹配的内容,这时可以用非捕获组来抵消使用( )带来的副作用。
表达式 |
说明 |
(?:Expression) |
进行子表达式Expression的匹配,并将匹配内容保存到最终的整个表达式的匹配结果中,但Expression匹配的内容不单独保存到一个组内 |
反向引用
捕获组匹配的内容,可以在正则表达式的外部程序中进行引用,也可以在表达式中进行引用,表达式中引用的方式就是反向引用。
反向引用通常用来查找重复的子串,或是限定某一子串成对出现。
表达式 |
说明 |
\1,\2 |
对序号为1和2的捕获组的反向引用 |
\k<name> |
对命名为name的捕获组的反向引用 |
环视
环视只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度的。
环视按照方向划分有顺序和逆序两种,按照是否匹配有肯定和否定两种,组合起来就有四种环视。环视相当于对所在位置加了一个附加条件。
表达式 |
说明 |
(?<=Expression) |
逆序肯定环视,表示所在位置左侧能够匹配Expression |
(?<!Expression) |
逆序否定环视,表示所在位置左侧不能匹配Expression |
(?=Expression) |
顺序肯定环视,表示所在位置右侧能够匹配Expression |
(?!Expression) |
顺序否定环视,表示所在位置右侧不能匹配Expression |
以上是关于正则表达式进阶的主要内容,如果未能解决你的问题,请参考以下文章