javascript里面RegExp的exec函数的总结

在我们的前端里面,经常会用到正则表达式进行检索字符串,刚好javascript里面提供RegExp来支持正则表达式,而RegExp对象的主要方法是exec()。

语法

RegExpObject.exec(string)
参数 描述
string 必需。要检索的字符串。

返回值:

返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

说明:

exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法以及支持正则表达式的 String 对象的方法更为复杂。

如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。

但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。

我们现在主要来看说明里面的第三段的内容,

看个例子:

<html>
<body>
<script type="text/javascript">
var str = "Visit W3School, W3School is a place to study web technology."; 
var patt = new RegExp("W3School","g");
var result;
while ((result = patt.exec(str)) != null)  {
  document.write(result);
  document.write("<br />");
  document.write(patt.lastIndex);
  document.write("<br />");
 }
document.write(patt.lastIndex);
</script>
</body>
</html>

运行结果如下:

W3School
14
W3School
24
0

可以看到在全局模式lastIndex会一直增加,直到遍历该字符串所有的字符,最后变为0,

所以有一个要注意的是,

如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0

示例如下:

var str = "Visit W3School, W3School is a place to study web technology."; 
var patt = new RegExp("W3School","g");
var result;
  result=patt.exec(str);
  document.write(result);
  document.write("<br />");
  document.write(patt.lastIndex);
  document.write("<br />");
var aa="W3School sfd sfsf"
var ddResult;
  ddResult= patt.exec(aa);
  document.write(ddResult);

结果如下:

W3School
14
null

之所以最后一个输出结果为null,是由于第一次匹配的结果的lastIndex变为14了。再去检索第二个字符串的时候会从14的位置开始,把前面13个字符去跳过去了,所以找不到,我们要想其从头看是,只需要在检索第二个字符串的开头,让其LastIndex置为0

结果就会为:

W3School
14
W3School

但这只是全局的才有这个问题,局部的话,没有这个问题,可以把上面的例子的全局的去掉,就可以得到

var str = "Visit W3School, W3School is a place to study web technology."; 
var patt = new RegExp("W3School","");
var result;
  result=patt.exec(str);
  document.write(result);
  document.write("<br />");
  document.write(patt.lastIndex);
  document.write("<br />");
var aa="W3School sfd sfsf"
var ddResult;
  ddResult= patt.exec(aa);
  document.write(ddResult);

运行的结果如下:

W3School
0
W3School

时间: 2024-10-01 22:44:50

javascript里面RegExp的exec函数的总结的相关文章

JavaScript中exec函数

JavaScript中exec函数是用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组.使用实例: rgExp.exec(str) 其中rgExp是必选项.包含正则表达式模式和可用标志的正则表达式对象. str是必选项.要在其中执行查找的 String 对象或字符串文字.http://www.120hrb.com 如果 exec 方法没有找到匹配,则它返回 null.如果它找到匹配,则 exec 方法返回一个数组,并且更新全局 RegExp 对象的属性,以反映匹配结果.数组的0元

关于javascript中RegExp的实例方法exex()和test()的小&#39;冲突&#39;

之前使用js中正则表达式的过程中,基本都是用的test方法,exec很少用,更别说test和exec混用的情况,今天碰巧遇到了这个情况,于是就发现了一个小'bug'. 比如我们要匹配全文中长度为4的单词,我们通常会这么做: var str = 'my last name is junhua' var reg = /\b\w{4}\b/gvar result, i = 1 while (i > 0) { result = reg.exec(str) if(!result) { break; } c

JS中exec函数与match函数的区别与联系

总结: 正则规则的声明,两种方法: exec是RegExp类的匹配方法 match是字符串类的匹配方法 var reg = /aaa/g; var reg = new RegExp("aaa","g"); 创建的时候 可以用 这两种方法创建,唯一的区别在于 第二种 用NEW的方法可以在规则内使用变量,例如 var name="xaiohua"; var reg=new RegExp("aa"+xiaohua+"aa&

JavaScript中RegExp对象

JavaScript中RegExp对象是保存有关正则表达式模式匹配信息的固有全局对象.使用方法: RegExp.property 必选项property 参数是 RegExp 对象的任意一个属性. RegExp 对象不能直接创建,但始终可以使用.在成功的正则表达式查找完成之前,RegExp 对象各属性的初始值如下所示: 属性简写初始值 index-1www.hljmlyfcyy.com lastIndex-1 lastMatch$&空字符串. lastParen$+空字符串. leftConte

Javascript的RegExp对象

正则表达式是一个描述字符模式的对象. JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. '*********************** ' javascript ' '*********************** 在JavaScript中,正则表达式是由一个RegExp对象表示的.当然,可以使用一个RegExp()构造函数来创建RegExp对象, 也可以用JavaScript 1.2中的新添加的一个特殊语法来创建Re

JavaScript中的Function(函数)对象

1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 5.得到表单中元素的名称和值:document.getElementById("表单中元素的ID号").name(或value) 6.一个小写转大

JavaScript基础学习之-JavaScript权威指南--8.7函数属性方法构造函数

函数属性.方法和构造函数 一.函数属性 函数是js中特殊的对象,可以拥有属性. funcation.length属性:代表形参的长度,只读属性,不允许更改 arguments.length代表的是实参长度 prototype属性:每个函数都有一个prototype属性,当把函数当做构造函数时,新创建的对象会从原型对象上继承属性. 二.函数方法 与其他语言不同,ECMAScript函数不介意传递进来多少个参数,也不在乎是什么类型.因为实参在内部是用一个类数组来表示的,函数接收到的始终是个类数组.

javascript篇:javascript对象——RegExp

直接量语法: /pattern[/attributes] 创建RegExp对象: var reg = new RegExp(pattern[,attributes]); pattern是一个字符串,指定正则表达式:attributes是一个可选的字符串,包含g,i,m,分别表示全局匹配.忽略大小写匹配和多行匹配 RegExp对象属性: global返回Boolean,指明RegExp对象是否具有标志g. ignoreCase返回Boolean,指明RegExp对象是否具有标志i. lastInd

javascript中的立即执行函数(function(){…})()

javascript中的立即执行函数(function(){…})() 深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是用(function(){…})()包住业务代码,使用jquery时比较常见. ( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因并非如此.要