在javascript高程这本书的第五章讲述RegExp实例方法的时候就有提到“捕获组”,捕获组是正则表达式中的概念。
首先看看下列创建正则表达式的语法(其中的模式(pattern)部分可以是任何简单或复杂的正则表达式)。
var expression = /pattern/flags;
在正则表达式中就可以分组,用一对圆括号括起来的表达式就是一个分组。
var ptr=/(pattern)/;//js中分组的基本写法
var pattern1=/(sun)(day)/;
例如上面的"/(sun)(day)/"就表示了由"sun"和"day"两个子表达式构成的两个分组(其实这两个分组也是捕获组),它的最终匹配效果和"/(sunday)/"是一样的,只是分组之后可以把各组子表达的结果分别处理,让操作更加灵活。
捕获组就是将正则表达式中的子表达式匹配的结果和分组按顺序保存,之后可以通过序号或者名称来使用这些内容。(目前还不支持捕获组命名,只能通过序号访问)
下面例举几个四则运算的例子,来了解一下捕获组的基本用法。
1.通过捕获组分别读取前运算数、运算符和后运算数:
var pattern2=/(\d+)([\+\-\*\/])(\d+)/;
var text="10*20";
var matches=pattern2.exec(text);//exec()接收一个参数,即要应用模式的字符串
alert(matches[0]);//输出10*20(整个字符串本身与模式匹配)
//序号0为匹配的内容,分组从序号1开始
alert(matches[1]);//10
alert(matches[2]);//*
alert(matches[3]);//20
在表达式中直接使用某个分组的内容,即捕获组的反向引用。
2.匹配前后两个数值相同的情况:
var pattern3=/(\d+)([\+\-\*\/])\1/;//反向引用时用"\+序号"
alert(pattern3.test("10-10"));//true
alert(pattern3.test("10-5"));//false
3.置换前后两个数的位置:
var str="123/456";
var pattern2=/(\d+)([\+\-\*\/])(\d+)/;
//在replace语句中引用的写法是“$+序号”
var laststr=str.repalce(pattern2,"$3$2$1");//456/123