正则表达式中的标志(/g和/m)


var exp=/pattern/flag
g:表示全局模式(global),即pattern将匹配出所有的匹配项,并非在发现第一个匹配项时就立即停止
(1)对于RegExp的test方法:加入g和不加入g没什么区别
     RegExpObject.test(string)        
         如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 false。
(2)对于RegExp的exec方法:加入g的话,第一次返回第一个匹配项,第二次返回第二个匹配项;不加入g的话,无论执行多少次都返回第一个匹配项。
        exec返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。
       当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。
var reg=/.at/;
var str="abcatdfgat";
var r1=reg.exec(str); //返回cat
var r2=reg.exec(str); //返回cat
var r3=reg.exec(str); //返回cat

var reg=/.at/g;
var str="abcatdfgat";
var r1=reg.exec(str); //返回cat
var r2=reg.exec(str); //返回gat
var r3=reg.exec(str); //返回null

(3)对于String的search方法,加不加入g都一样
stringObject.search(regexp)
stringObject 中第一个与 regexp 相匹配的子串的起始位置。如果没有找到任何匹配的子串,则返回 -1。

search() 方法不执行全局匹配,它将忽略标志 g。它同时忽略 regexp 的 lastIndex 属性,并且总是从字符串的开始进行检索,这意味着它总是返回 stringObject 的第一个匹配的位置。

(4)对于String的split方法,加不加入g都一样
         stringObject.split(separator,howmany)返回一个数组
(5)对于String的match方法:加入g,一次返回所有的匹配项;不加入g,只返回第一个匹配项。
var reg=/.at/; 
var str="abcatdfgat";
var r1 =str.match(reg);  ; 
//返回cat

var reg=/.at/; 
var str="abcatdfgat";
var r1=str.match(reg); 
//返回cat、gat
存放匹配结果的数组。该数组的内容依赖于 regexp 是否具有全局标志 g。

如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在 stringObject 中的位置,input 属性声明的是对 stringObject 的引用。

如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性。

注意:在全局检索模式下,match() 即不提供与子表达式匹配的文本的信息,也不声明每个匹配子串的位置。如果您需要这些全局检索的信息,可以使用 RegExp.exec()。

(6)对于String的replace方法,不加入g,只替换第一个匹配项,加入g的话替换所有的匹配项。

m:表示多行模式(multiline),可以进行多行匹配,但是只有使用^和$模式时才起作用,在其他模式中,加不加入m都可以进行多行匹配

(1)对于^和$,在多行模式下,它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾进行匹配。(在此模式下,$的精确含义是:匹配\n之前的位置以及字符串结束前的位置)
     //有问题
var reg=/a.$/;
var str="a1"
+"catd"
+"a3dbfa2";
var str='a1\
catd\
a3dbfa2';
var r1=str.match(reg); 
不加m,结果是a1;加m,结果是a1;加mg,结果是a1和a2(实际为a1,并没有进行多行匹配);加g,结果是a1。加m表示可以进行多行匹配,加入g表示可以进行全局匹配,综合到一起就是可以进行多行全局匹配。
(2)其他模式(及时不加m也可以进行多行匹配):
var reg=/.at/;
var str="at"+
"catd"+
"fgat";
var r1=str.match(reg);  //输出cat

var reg=/.at/g;
var str="at"+
"catd"+
"fgat";
var r1=str.match(reg); //输出cat,gat

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值