复制代码 代码如下:
reg = /(\w)\1/;
str=''blueidea'';
execReg(reg,str);
则会返回null。这里的“\1”就叫做反向引用,它表示的是第一个括号内的字正则表达式匹配的内容。在上面的例子中,第一个括号里的(\w)匹配了b,因此“\1”就同样表示b了,在余下的字符串里自然找不到b了。
与第二个例子对比就可以发现,“\1”是等同于“第1个括号匹配的内容”,而不是“第一个括号的内容”。
复制代码 代码如下:
reg = /(\w)\1/;
str=''bbs.blueidea.com'';
execReg(reg,str);
这个正则则会匹配到bb。
同样,前面有几个子正则表达式我们就可以使用几个反向引用。例如:
复制代码 代码如下:
reg = /(\w)(\w)\2\1/;
str=''woow'';
execReg(reg,str);
会匹配成功,因为第一个括号匹配到w,第二个括号匹配到o,而\2\1则表示ow,恰好匹配了字符串的最后两个字符。
括号(2)
前面我们曾经讨论过一次括号的问题,见下面这个例子:
复制代码 代码如下:
reg = /^(b|c).+/;
str=''bbs.blueidea.com'';
execReg(reg,str);
这个正则是为了实现只匹配以b或者c开头的字符串,一直匹配到换行字符,但是。上面我们已经看到了,可以使用“\1”来反向引用这个括号里的子正则表达式所匹配的内容。而且exec方法也会将这个字正则表达式的匹配结果保存到返回的结果中。
不记录子正则表达式的匹配结果
使用形如(?:pattern)的正则就可以避免保存括号内的匹配结果。例如:
复制代码 代码如下:
reg = /^(?:b|c).+/;
str=''bbs.blueidea.com'';
execReg(reg,str);
可以看到返回的结果不再包括那个括号内的字正则表达式多匹配的内容。
同理,反向引用也不好使了:
复制代码 代码如下:
reg = /^(b|c)\1/;
str=''bbs.blueidea.com'';
execReg(reg,str);
返回bb,b。bb是整个正则表达式匹配的内容,而b是第一个子正则表达式匹配的内容。
复制代码 代码如下:
reg = /^(?:b|c)\1/;
str=''bbs.blueidea.com'';
execReg(reg,str);
返回null。由于根本就没有记录括号内匹配的内容,自然没有办法反向引用了。
正向预查
形式:(?=pattern)
所谓正向预查,意思就是:要匹配的字符串,后面必须紧跟着pattern!
我们知道正则表达式/cainiao/会匹配cainiao。同样,也会匹配cainiao9中的cainiao。但是我们可能希望,cainiao只能匹配cainiao8中的菜鸟。这时候就可以像下面这样写:/cainiao(?=8)/,看两个实例:
复制代码 代码如下:
reg = /cainiao(?=8)/;
str=''cainiao9'';
execReg(reg,str);
返回null。
复制代码 代码如下:
reg = /cainiao(?=8)/;
str=''cainiao8'';
execReg(reg,str);
匹配cainiao。
需要注意的是,括号里的内容并不参与真正的匹配,只是检查一下后面的字符是否符合要求而已,例如上面的正则,返回的是cainiao,而不是cainiao8。
再来看两个例子:
复制代码 代码如下:
reg = /blue(?=idea)/;
str=''blueidea'';
execReg(reg,str);
匹配到blue,而不是blueidea。
复制代码 代码如下:
reg = /blue(?=idea)/;
str=''bluetooth'';
execReg(reg,str);
返回null,因为blue后面不是idea。
复制代码 代码如下:
reg = /blue(?=idea)/;
str=''bluetoothidea'';
execReg(reg,str);
同样返回null。
?!
形式(?!pattern)和?=恰好相反,要求字符串的后面不能紧跟着某个pattern,还拿上面的例子:
复制代码 代码如下:
reg = /blue(?!idea)/;
str=''blueidea'';
execReg(reg,str);
返回null,因为正则要求,blue的后面不能是idea。
复制代码 代码如下:
reg = /blue(?!idea)/;
str=''bluetooth'';
execReg(reg,str);
/[code]
则成功返回blue。
匹配元字符
首先要搞清楚什么是元字符呢?我们之前用过*,+,?之类的符号,它们在正则表达式中都有一定的特殊含义,类似这些