今天复习了一下正则表达式,记录一下老是忘记的东西
注:exec方法返回的其实并不是匹配结果字符串,而是一个对象,里面含有匹配结果字符串,在这里为了简单简写了。
一,反向引用:
形式如下:/(子正则表达式)\1/
例子:
1、reg = /\w/; \w表示单词字符,等同于字符集合[a-zA-Z0-9_]。
str='bluesky';
reg.exec(str); 返回b
2、reg = /(\w)\1/;
str='bluesky';
reg.exec(str); 返回null
这里的“\1”就叫做反向引用,它表示的是第一个括号内的子正则表达式匹配的内容。在上面的例子中,第一个括号里的(\w)匹配了 b,因此“\1”就同样表示b了,在余下的字符串里自然找不到b。
3、reg = /(\w)(\w)\2\1/; \n表示引用第n项子正则表达式,有几个子正则表达式我们就可以使用几个反向引用。
str='woow';
reg.exec(str); 返回woow,第一个括号匹配到w,第二个括号匹配到o,而\2\1则表示ow
4、reg = /(\w)(\w)/;
str='bluesky';
reg.exec(str); 返回bl,b,l
bl是整个正则匹配的内容,b是第一个括号里的子正则表达式匹配的内容,l是第二个括号匹配的内容。因为exec方法会将子正则表达式的匹配结果保存到返回的结果中。
如果不想记录子正则表达式的匹配结果:(?:pattern)就可以避免
如:1、reg = /^(b|c).+/; 匹配以b或c开头,以及其后的 所有的非换行字符。
str='bbc.haha.com';
reg.exec(str); 返回bbc.haha.com, b(这里的b就是子正则表达式的匹配结果)
2、reg = /^(?:b|c).+/;
str='bbc.haha.com';
reg.exec(str); 返回bbc.haha.com ,不再保存子正则表达式匹配到的b
3、reg = /^(?:b|c)\1/;
str='bbc.haha.com';
reg.exec(str); 返回null,由于根本没有记录括号内匹配的内容,自然没有办法反向引用了
二、正向预查
形式:(?=pattern) ,意思就是:要匹配的字符串,后面必须紧跟着pattern
如:1、reg = /beautiful(?=8)/; 匹配beautiful,且后面必须紧跟着8
str='beautiful9';
reg.exec(str); 返回null
2、reg = /beautiful(?=8)/; 匹配beautiful,且后面必须为8
str='beautiful8';
reg.exec(str); 返回beautiful
需要注意的是,括号里的内容并不参与真正的匹配,只是检查一下后面的字符是否符合要求而已
形式(?!pattern)和?=恰好相反,要求字符串的后面不能紧跟着某个pattern
如:1、reg = /beautiful(?!8)/; 匹配beautiful,且后面不为8
str='beautiful9';
reg.exec(str); 返回beautiful
三、匹配元字符
我们之前用过*,+,?之类的符号,它们在正则表达式中都有一定的特殊含义,类似这些有特殊功能的字符都叫做元字符。例如:
reg = /a*/; 表示任意个a,但是如果我们真的想匹配’a*’这个字符串的时候怎么办呢?只要将*转义了就可以了,如下:
reg = /c\*/;
同理,要匹配其他元字符,只要在前面加上一个“ \ ”。