正则表达式分组实例详解
正则表达式分组:
如果想匹配3个数字,正则表达式可以用如下写法:
\d{3}
以上代码使用重复量词可以匹配3位数字。
但是在实际应用中,往往需要重复多个字符,例如我想重复ab两个字符,使用以下代码就不合适了,代码如下:
ab{3}
以上正则表达式只能够重复3次b。
为了实现重复多个字符可以使用小括号来指定子表达式或者说分组来实现此功能,例如:
(ab){3}
上面的正则就可以重复ab了。
所谓的分组就是使用小括号将一些项包括起来,使其成为独立的逻辑域,那么就可以像处理一个独立单元一样去处理小括号的内容。
下面看一段代码实例:
(\d{1,3}\.){3}\d{1,3}
上面是一个简单的ip匹配正则表达式。由小括号包裹的内容会被作为一个独立的逻辑域进行操作。
分组的作用:
在正则表达式中,分组具有举足轻重的作用,下面就简单对它的功能做一下简单的介绍。
一.起到原始的分组作用:
把单独的项目进行分组,以便合成子表达式,这样就可以像处理一个单独的字符那样,对其应用|、+、*或者?等元字符来操作它们。
实例代码如下:
var str="i love javascript and java"; console.log(str.match(/java(script)?/gi));
由以上代码的运行结果可以看出,正则表达式既可以匹配字符串javascript也可以匹配java,这是因在正则表达式中采用了分组,并且使用重复量词?,可以使前面的子表达式重复0次或者1次。
二.定义子模式:
分组另一个非常重要的作用就是在完整的模式中定义子模式。
当一个正则表达式成功的和目标字符串相匹配时,可以从目标字符串中抽出和小括号中字表达式相匹配的部分。
假如我们匹配的是以一个数字开头的后面跟着一个或者多个不区分大小写的字母的字符串,正则表达式可以这样写:
/\d[a-za-z]+/
假如我们真正关心和需要的是开头的数字,那么就可以将正则表达式的数字部分放入小括号就可以从检索到的匹配中抽取数字.
/(\d)[a-za-z]+/
三.引用子表达式:
正则表达语法中可以在同一个表达式中的后部引用前面的子表达式。这是通过在"\"后面跟随数字实现的。此数字指定了小括号字表达式在正则表达式中的位置,例如\1是引用的第一个带有圆括号的子表达式,自然\2就是第二个带有圆括号的子表达式。
特别注意:由于子表达式是可以相互嵌套的,那么计算子表达式的位置的时候,只要确定左括号的位置即可。例如:
/(java(script))/
在以上正则表达式中,嵌套的子表示是可以用\2表示。
对于子表达式的引用,并不是引用的匹配模式,而是对子表示匹配内容的引用。一般来说对子表达式的引用一般是用来实施一条约束,看下面的代码:
/(['"])[^'"]*\1/
通常情况下左右引号是相匹配的,如果前面是双引号,那么结尾也要是双引号,前面是单引号那么结尾也必须是单引号,并且字符串中间不能够再出现其他的引号,例如:
"欢迎您"
'欢迎您'
那么上面的正则表达式就实现此功能,当前面的子表达式匹配单引号的时候,那么后面的\1也就表示的是单引号,如果子表示匹配的双引号,那么后面的\2就表示的是双引号。
非引用型分组:
分组会占用一定的系统资源,尤其是正则表达式较长的时候会降低匹配速度。有时候仅仅是为了设置一个分组,并不需要引用,那么使用非引用类型分组将会是一个良好的选择。
/(java(?:script))/
以上正则就是使用非引用分组,只要在左括号后面加上一个?:即可。
上一篇: PHP 正则表达式效率 贪婪、非贪婪与回溯分析(推荐)
下一篇: ES2015 正则表达式新增特性