正则表达式中 g, m 参数是什么意思

作者: 来源: 日期:2009-12-28

(总共有三个参数,另一个是 i,表示忽略大小写,这个好理解。ITPOW编辑注)

(推荐阅读:正则表达式中 test、exec、match 方法区别白话解释正则表达式中参数 g、m、i 的作用。ITPOW编辑注)

为了解答“正则表达式 (/[^0-9]/g,'') 中的 "/g" 是什么意思?”这个问题,也为了能够便于大家对正则表达式有一个更为综合和深刻的认识,我将一些关键点和容易犯糊涂的地方再系统总结一下。

总结 1:附件参数 g 的用法

表达式加上参数 g 之后,表明可以进行全局匹配,注意这里“可以”的含义。我们详细叙述:

1)对于表达式对象的 exec 方法,不加入 g,则只返回第一个匹配,无论执行多少次均是如此,如果加入 g,则第一次执行也返回第一个匹配,再执行返回第二个匹配,依次类推。例如

var regx=/user\d/;

var str=“user18dsdfuser2dsfsd”;

var rs=regx.exec(str);// 此时 rs 的值为 {user1}

var rs2=regx.exec(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 rs=regx.exec(str);

结果:匹配成功,rs 的值为:{ },如果表达式为 /a\n\rbc/,则不会被匹配,因此在一般的编辑器中一个”Enter”键代表着“回车换行”,而非“换行回车”,至少在 textarea 域中是这样的。

原文见:http://www.cnblogs.com/shunyao8210/archive/2008/11/13/1332591.html

相关文章