Javascript字符串匹配match和exec

在Javascript中,String对象的match方法和RegExp对象的exec方法都可用于字符串的匹配,今天我们来看看怎么使用他们。

match

match返回的都是一个数组,但又分成两种情形:当进行非全局匹配时该数组第一项为完整匹配字符串,其他项则为正则表达式中括号内的子匹配;当进行全局匹配时该数组全部项都为完整匹配字符串。

<script type="text/javascript">
//非全局匹配
var content = "abc@mzwu.com and abc@163.com";
var regExp = /([\w]+?)@([\w\.]+)/i;

var matchs = content.match(regExp);
if(matchs != null)for(var i=0;i<matchs.length;i++)alert(matchs[i]);
</script>

<script type="text/javascript">
//全局匹配
var content = "abc@mzwu.com and abc@163.com";
var regExp = /([\w]+?)@([\w\.]+)/ig;

var matchs = content.match(regExp);
if(matchs != null)for(var i=0;i<matchs.length;i++)alert(matchs[i]);
</script>

exec

exec返回的也是一个数组,并且第一项总是完整匹配字符串,其他项则为正则表达式中括号内的子匹配,但也可以分成两种情形:当进行非全局匹配时结果和match的非全局匹配相同;当进行全局匹配时,如果要返回第二个匹配字符中及其子匹配就得再次调用同一个RegExp对象的exec方法,如果要返回第三个匹配字符中及其子匹配就得第三次调用同一个RegExp对象的exec方法,依此类推,也就是说,当第n次调用同一RegExp对象的exec方法时将返回第n个完整匹配字符串及其子匹配组成的数组。

<script type="text/javascript">
//非全局匹配
var content = "abc@mzwu.com and abc@163.com";
var regExp = /([\w]+?)@([\w\.]+)/;

var execs;
//不能用while,否则将导致死循环
if((execs = regExp.exec(content)) != null)for(var i=0;i<execs.length;i++)alert(execs[i]);
</script>

<script type="text/javascript">
//全局匹配
var content = "abc@mzwu.com and abc@163.com";
var regExp = /([\w]+?)@([\w\.]+)/ig;

var execs;
while((execs = regExp.exec(content)) != null)for(var i=0;i<execs.length;i++)alert(execs[i]);
</script>

当调用非同一RegExp对象时将无效:
<script type="text/javascript">
//全局匹配
var content = "abc@mzwu.com and abc@163.com";

var execs;
if((execs = (/([\w]+?)@([\w\.]+)/ig).exec(content)) != null)for(var i=0;i<execs.length;i++)alert(execs[i]);
if((execs = (/([\w]+?)@([\w\.]+)/ig).exec(content)) != null)for(var i=0;i<execs.length;i++)alert(execs[i]);
</script>


其他说明:

match和exec方法返回的数组都带有三个属性:input、index 和 lastIndex。input为被匹配的字符串,index为最后一次匹配字符串的开始位置,lastIndex为最后一次匹配字符串最后一个字符的下一个位置。当再次调用同一RegExp对象的exec方法时,将从RegExp对象的lastIndex位置开始匹配。

评论: 0 | 引用: 0 | 查看次数: 10103
发表评论
登录后再发表评论!