正则表达式---小括号与后向引用(三)

小括号:

(pattern)          : 匹配对应的pattern,然后将匹配到的内容捕获到自动命名的组里  

自动命名的组  : 使用小括号指定一个子表达式后,匹配这个子表达式的文本可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:以分组的左括号为标志,从左向右,第一个分组的组号为1,第二个为2,以此类推。

后向引用:

后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本。

例子:

1:匹配ip地址(26.254.126.10等)

注意:IP字段里有三种情况:一位数、二位数、三位数。其中二位数和三位数此处要求不能以0开头,并且最大数为255

首先给出他人的答案:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?),此处解释:将IP分为两种情况一个是3个数字和一个.作为一个组,第二个是以3个数字结尾。(2[0-4]\d|25[0-5]|[01]?\d\d?)\.)代表匹配字段  200-249.  或者  250-255.  或者  以0或1开头(不满足则判断下一处规则符合,参考符号?的用法)接下来0-9接下来0-9(不满足则忽略)最后一个. 。 然后重复匹配3次该规则,最后再匹配一次没有 . 字符的上述规则。通过上述阐释,我们可以发现,它能匹配到056这种不合要求的pattern

 我们将其修改下即可:

注意: 在别人的结果中规则:[1]?[1-9]\d?匹配103这里的1到底是按规则[1]?还是[1-9]来匹配的?。。103中的1会先匹配规则[1]?然后匹配[1-9],但是发现匹配失败而[1]?是可忽略项规则,那么换匹配规则--匹配规则[1-9],然后103中的0匹配\d?成功,最后一个3没有了对应的匹配规则(也就是匹配规则已经结束),所以在匹配结果里面只有10匹配成功了。

2:后向引用匹配重复的单词(go go, kitty kitty等)

按一下的匹配规则\b(\w+)\b\s+(\1\s){1,3},捕获了相同单词的全匹配。匹配方式暂且细细体会,匹配思路:如果要匹配go go go,那么我们需要找出规律,go是重复出现那么将其捕获放进组里,接着go与go之间空格数量未知那么以\s+来匹配,为什么要用\b呢?请了解正则表达式---基础符号(二)。其实里面讲到了\b匹配的是单词的间隔,当正则匹配规则是\b时去匹配pattern如go,它其实流程是先匹配g前面的第0位置,而这个第0位置就是间隔,匹配好第0位置接下来匹配g然后失败,注意的是它不会去匹配g和o之间的第1位置而是直接匹配o,然后匹配失败,最后找o后面是否还有内容,没有内容了就去匹配o后面的第2位置,匹配成功。这以上就是\b(\w+)\b\s+的意思。接下来由于(\w+)匹配到的只是一组go,然后\1便是从第一个捕获组里面取出捕获的内容然后来判断是否匹配后面pattern,结果便是匹配成功了一次go,然后再次匹配一次空格(这里是一次空格哦,看是否能完善吧),然后将匹配的一次go空格作为第二组捕获,最后重复1到3次

接下来演示第二组匹配规则:(\b(\w+)\b\s+)\2\s+\2*

思路可以按照第一种去理解,注意的是(())小括号里面的小括号到底是第几个捕获组,在此看explanation,第一个捕获组是(\b(\w+)\b\s+),第二个捕获组才是(\w+),之后会进一步深入了解小括号的使用

 

猜你喜欢

转载自blog.csdn.net/qq_40258437/article/details/87924100
今日推荐