正则表达式

分组、后向引用与转义

本文继续总结正则表达式的其它内容,主要是分组、后向引用以及转义符。

文章还是会以实例的模式和大家一起学习,下面是用来实验所用的文件。

java正则表达式分号间隔 java 正则 分组_java正则表达式 分组引用

1

( )

在讲分组之前,还是先一起回顾下匹配指定次数的正则,如"{2} "表示匹配到其前面的字符连续出现2次的行,比如说,我们可以用"qin{2}"将regular_3.txt文件的第4行qinn li匹配到。

但是,如果我们想要匹配连续出现2次qin的行了?单纯的使用"{2} " 就无能为力了,这时候就需要用到分组了,在正则表达式中,( )表示分组,所谓的分组就是把( ) 中出现的内容当做一个整体。

好了,现在可以找出regular_3.txt 文件连续出现2次qin的行了 ,没错,(qin){2}就是将qin当做一个整体,再和后面的{2} 结合起来表示匹配qin两次,就是这么简单。

java正则表达式分号间隔 java 正则 分组_java正则表达式 分组引用

分组还可以嵌套,这又是什么意思了。看下面的例子。这个表达式看起来很复杂,我们拆开分析相对来说会容易理解些:黄色部分的两侧是( ),因此需要将其作为一个整体和后面的{2} 结合起来就是黄色部分出现2次的行被匹配。

好了,那么黄色部分是又是什么了,可以看出,黄色部分内部的正则为ab(ef){2},这个正则应该不难看出它表示的是abefef吧。

因此,可以分析出整个表达式(ab(ef){2}){2}就是匹配abefef 出现2次的行。

java正则表达式分号间隔 java 正则 分组_java正则表达式 分组引用

2

n

我们现在可以介绍后向引用了,后向引用是建立在分组的前提上的,这也是为什么我们先讲分组的原因。

在一个含有分组的正则表达式中,默认情况下,每个分组会自动拥有一个组号(从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推)后向引用用于重复搜索前面某个分组匹配的文本。例如,1 代表此处需要再次匹配分组1的内容。

现在有个小任务,是需要将原始文件的第1行和第6行匹配出。也就说匹配出li前后单词相同的两行。

java正则表达式分号间隔 java 正则 分组_java正则表达式 分组引用

不少人会写出下面的式子,但是从输出看来,结果并不符合要求,因为第二行li 的前后单词不一样,但是也匹配上了。

java正则表达式分号间隔 java 正则 分组_java正则表达式 分组引用

这时候,后向引用就能派上用途了。看到没,表达式(...) li 1含有一个分组(...),这个分组表示匹配任意3个字符,那么表达式后面的1就表示(...) 匹配到什么,这里需要再匹配一次。

因此,如果通过(...) 匹配上了qin,那么在li后面也需要再匹配到qin才能匹配上该行,因此第2行不会匹配上,第1行能匹配上;如果通过(...) 匹配上了qzz,那么在li后面也需要再匹配到qzz才能匹配上 该行,因此第6行能匹配上 。

java正则表达式分号间隔 java 正则 分组_java正则表达式 分组引用

3

在正则表达式中表示转义,还记得我们前面介绍过的字符 .吗,在正则表达式中,这些字符有特殊含义,比如说 . 表示匹配任意字符。那如果想要正则表达式就匹配文件中的.本身了,这时候就需要转义字符了。如下所示,注意正则表达式中有无转义字符所匹配结果的区别。

java正则表达式分号间隔 java 正则 分组_正则_07

java正则表达式分号间隔 java 正则 分组_java正则表达式 分组引用

再举个例子,如果要匹配regular_4.txt 文件中含有的行,应该怎么办了,很简单,只要在前面再加一个就好了,如下。

java正则表达式分号间隔 java 正则 分组_java正则表达式 分组引用

总结

本文是正则表达式系列的第四篇文章,主要总结了正则表达式中分组、后向引用以及转义符的用法,后面将会继续总结正则表达式其它的规则,希望对大家有所帮助,文章中如有遗漏或错误之处,还望大家指出!

java正则表达式分号间隔 java 正则 分组_java正则表达式 分组引用