正则表达式的定义
方法一:new RegExp(pattern, attributes),
注意var reg = new RegExp('\\sjava\\s','m');模式字符串里面的一些带反斜杠的字符需要转义
方法二:reg = /abc/;
直接量字符
还有一些字符在正则表达式中具有特殊的含义,要匹配它们要进行转义
字符类(character class)
重复
这些是在模式之后跟随,用以指定字符重复的标记
贪婪的匹配和非贪婪的匹配
贪婪模式下的匹配
<span style="font-size:18px;"> var str = 'aaabbb';
var reg = /a*b/;
console.log(reg.exec(str));//输出的结果 ["aaab", index: 0, input: "aaabbb"]
/*
下面是reg.exec(str)匹配的过程,从后向前回朔,
console.log(reg.exec(aaabbb));第一次
console.log(reg.exec(aaabb));第二次
console.log(reg.exec(aaab));第三次 匹配成功
*/</span>
典型例子
<span style="font-size:18px;">
var str = 'aaabbbab';
var reg = /a*b/g;
for(var i=0;i<4;i++){
var obj = reg.exec(str);
console.log(obj);
}</span>
匹配结果中输出了 两次b,其实就是贪婪匹配,完成第一次匹配后,以第一次匹配的结束点为起始点
继续匹配得到的结果,
非贪婪模式下的匹配
上面典型例题中的费贪婪模式和贪婪模式是一样,非贪婪模式下就是从左往右的方向匹配的,所以结果一样
我们看一下下面的简单例子
var str = 'aaaa';
var reg = /a+?/g;
for(var i=0;i<4;i++){
var obj = reg.exec(str);
console.log(obj);
}
这里把4个a输出来了,容易理解因为它是从左往右挨个字符匹配的,这里的贪婪模式下将只会匹配到一个
'aaaa',因为从右往左第一个就是匹配'aaaa',所以没有继续下去了。
选择,分组,引用
指定匹配的位置
这里并不会真的去匹配一个字符什么的,而是匹配了字符简的位置,
var str = 'ab';
var reg = /a(?=b)/g;
var obj = str.match(reg);
console.log(obj);
输出结果为["a"],并不会真正的去匹配一个字符,
而是匹配位置关系,本例中是匹配的a必须后面跟上一个b才行
修饰符
其中i是大小写不区分,英文是ignore case,g是global,m是multiply多的,
多行匹配只有在匹配文本开头^和结束&,并且匹配的字符存在换行符时才能看的到效果
例子:
var str = 'ab\r\nacd';
var reg = /^a.*/g;
var obj = str.match(reg);
console.log(obj);
只能匹配到一个["
ab"],下面更改模式为/gm
<span style="font-size:18px;">var str = 'ab\r\nacd';
var reg = /^a.*/gm;
var obj = str.match(reg);
console.log(obj);</span>
输出字符为["ab","acd"],这里在Windows中文条件下的换行是\r\n,
这里用了多行匹配所有的行头是a的字符串都被匹配下来了
String 的match()和RegExp的exec()方法的比较
两个都是返回一个数组对象,其中exec()方法还会在数组对象中增加两个属性,input和index,
而match()方法就是放回一个数组,还有个点就是,当match()执行的正则只还有全局匹配或是
只含有子表达式时,match()方法放回的数组里面都会去执行子匹配或是子表达式的匹配,
当含有两个时,就只执行全局匹配。
例子
var str = 'abab';
var reg = /ab/g;
var obj = str.match(reg);
console.log(obj);
//["ab", "ab"]
var str = 'ab';
var reg = /a(b)/;
var obj = str.match(reg);
console.log(obj);
//["ab", "b", index: 0, input: "ab"]
var str = 'ab';
var reg = /a(b)/g;
var obj = str.match(reg);
console.log(obj);
//["ab"]
而exec()方法会执行子匹配和全局匹配
var str = 'abab';
var reg = /a(b)/g;
for(var i=0;i<3;i++){
var obj = reg.exec(str);
console.log(obj);
}
exec()输出的数组第一个元素后的元素怎么样都是子匹配的结果。