正则表达式中的g是什么意思附件参数g的⽤法
为了解答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”这个问题,也为了能够便于⼤家对正则表达式有⼀个更为综合和深刻的认识,我将⼀些关键点和容易犯糊涂的地⽅再系统总结⼀下。
总结1:附件参数g的⽤法
表达式加上参数g之后,表明可以进⾏全局匹配,注意这⾥“可以”的含义。我们详细叙述:
1)对于表达式对象的exec⽅法,不加⼊g,则只返回第⼀个匹配,⽆论执⾏多少次均是如此,如果加⼊g,则第⼀次执⾏也返回第⼀个匹配,再执⾏返回第⼆个匹配,依次类推。例如
var regx=/user\d/;
var str=“user18dsdfuser2dsfsd”;
var (str);//此时rs的值为{user1}
var (str);//此时rs的值依然为{user1}
如果regx=/user\d/g;则rs的值为{user1},rs2的值为{user2}
通过这个例⼦说明:对于exec⽅法,表达式加⼊了g,并不是说执⾏exec⽅法就可以返回所有的匹配,⽽是说加⼊了g之后,我可以通过某种⽅式得到所有的匹配,这⾥的“⽅式”对于exec⽽⾔,就是依次执⾏这个⽅法即可。
2)对于表达式对象的test⽅法,加⼊g于不加上g没有什么区别。
3)对于String对象的match⽅法,不加⼊g,也只是返回第⼀个匹配,⼀直执⾏match⽅法也总是返回第⼀个匹配,加⼊g,则⼀次返回所有的匹配(注意这与表达式对象的exec⽅法不同,对于exec⽽⾔,表达式即使加上了g,也不会⼀次返回所有的匹配)。例如:
var regx=/user\d/;
var str=“user1sdfsffuser2dfsdf”;
var rs=str.match(regx);//此时rs的值为{user1}
var rs2=str.match(regx);//此时rs的值依然为{user1}
如果regx=/user\d/g,则rs的值为{user1,user2},rs2的值也为{user1,user2}
4)对于String对象的replace⽅法,表达式不加⼊g,则只替换第⼀个匹配,如果加⼊g,则替换所有匹配。(开头的三道测试题能很好的说明这⼀点)
5)对于String对象的split⽅法,加上g与不加g是⼀样的,即:
var sep=/user\d/;
var array=“user1dfsfuser2dfsf”.split(sep);
则array的值为{dfsf, dfsf}
此时sep=/user\d/g,返回值是⼀样的。
6)对于String对象的search⽅法,加不加g也是⼀样的。
总结2:附加参数m的⽤法
附加参数m,表明可以进⾏多⾏匹配,但是这个只有当使⽤^和$模式时才会起作⽤,在其他的模式中,加不加⼊m都可以进⾏多⾏匹配(其实说多⾏的字符串也是⼀个普通字符串),我们举例说明这⼀点
1)使⽤^的例⼦
var regx=/^b./g;
var str=“bd76 dfsdf
sdfsdfs dffs
b76dsf sdfsdf”;
var rs=str.match(regx);
此时加⼊g和不加⼊g,都只返回第⼀个匹配{bd},如果regx=/^b./gm,则返回所有的匹配{bd,b7},注意如果regx=/^b./m,则也只返回第⼀个匹配。所以,加⼊m表明可以进⾏多⾏匹配,加⼊g表明可以进⾏全局匹配,综合到⼀起就是可以进⾏多⾏全局匹配
2)使⽤其他模式的例⼦,例如
var regx=/user\d/;
var str=“sdfsfsdfsdf
sdfsuser3 dffs
b76dsf user6”;
var rs=str.match(regx);
此时不加参数g,则返回{user3},加⼊参数g返回{user3,user6},加不加⼊m对此没有影响。
3)因此对于m我们要清楚它的使⽤,记住它只对^和$模式起作⽤,在这两种模式中,m的作⽤为:如果不加⼊m,则只能在第⼀⾏进⾏匹配,如果加⼊m则可以在所有的⾏进⾏匹配。我们再看⼀个^的例⼦
var regx=/^b./;
var str=“ret76 dfsdf
bjfsdfs dffs
b76dsf sdfsdf”;
var rs=str.match(regx);
此时rs的值为null,如果加⼊g,rs的值仍然为null,如果加⼊m,则rs的值为{bj}(也就是说,在第⼀⾏没有到匹配,因为有参数m,所以可以继续去下⾯的⾏去是否有匹配),如果m和g都加上,则返回{bj,b7}(只加m不加g说明,可以去多⾏进⾏匹配,但是到⼀个匹配后就返回,加⼊g表明将多⾏中所有的匹配返回,当然对于match⽅法是如此,对于exec呢,则需要执⾏多次才能依次返回)
总结3:在HTML的textarea输⼊域中,按⼀个Enter键,对应的控制字符为“\r\n”,即“回车换⾏”,⽽不是“\n\r”,即“换⾏回车”,我们看⼀个前⾯我们举过的例⼦:
var regx=/a\r\nbc/;
var str=“a
bc”;
var (str);
结果:匹配成功,rs的值为:{ },如果表达式为/a\n\rbc/,则不会被匹配,因此在⼀般的编辑器中⼀个”Enter”键代表着“回车换⾏”,⽽⾮“换⾏回车”,⾄少在textarea域中是这样的。正则匹配是什么
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论