`

javascript中RegExp的exec方法和String的match方法

阅读更多

正则表达式是一个强大的东西,以前一直对这里比较模糊,这里写下理解。

 

RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。下面是两种创建方式

var patt =/pattern/attributes

参数 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用

于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,

不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该

参数。

 


var patt =new RegExp(pattern, attributes);

至于那些有多少元字符、负向类、范围类、组合类、预定义类、量词什么的这里就不说了。javascript中有这些,java中也有这些,linux中也会用到这些,其实eclipse中查找搜索也会用到,这里这些还是比较重要的。网上一搜也是很多。这里提供一个链接,是w3c官网的。

http://www.w3school.com.cn/js/jsref_obj_regexp.asp

进入整体exec和match方法

一:exec

exec方法

返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 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。

 

 

二:match方法

 

 

如果 match 方法没有找到匹配,返回 null。如果找到匹配返回一个数组并且更新全局 RegExp 对象的属性以反映匹配结果。

match 方法返回的数组有三个属性:inputindexlastIndexInput 属性包含整个的被查找字符串。Index 属性包含了在整个被查找字符串中匹配的子字符串的位置。LastIndex 属性包含了最后一次匹配中最后一个字符的下一个位置。

如果没有设置全局标志 (g),数组的0元素包含整个匹配,而第 1 到 n 元素包含了匹配中曾出现过的任一个子匹配。这相当于没有设置全局标志的 exec 方法。如果设置了全局标志,元素0到n中包含所有匹配。

 

 

列举实例:

 

var str = "a2a2bb1b1c3c3afasfasjlajfklas"; 

var p = /(\w)(\d)\1\2/g;

var result;

console.log(p.lastIndex);

while ((result = p.exec(str)) != null)  {

  console.log(result);

  console.log(p.lastIndex);

}

 

 

得到结果为:

 

0
1:["a2a2", "a", "2"]   //这个数组的index为0 ,input属性都是str,下面的也是一样
4

 

2:

 

["b1b1", "b", "1"]  //这个数组的index为4

 

9

 

3:

 

["c3c3", "c", "3"]  //这个数组的index为9

 

13
可以看出这个是一个全局的正在表达式,开始lastIndex为0,即从开始查找,这个都很容易理解。第一次循环找到一个,这时候把lastIndex设为4,第二个“2”的下一个位置为4,循环三次后再也没找到匹配的则lastIndex为0。这样就都很容易理解了。这样得到了所有匹配的完成信息。其中第一个数组"a"为方向引用\1也就是\w匹配的,"2"为第二个反向引用\2也就是\d匹配的。后面的都是一样的理解。

有时候我们不需要这些方向引用的,只想知道匹配的那些字符。那我们就可以这样,一句搞定。str.match(p)就可以得到

 

 

["a2a2", "b1b1", "c3c3"]

 

 

 

 

理解如果正在表达式不是全局的这是exec和match得到结果其实是一样的。例如:

var str = "a2a2bb1b1c3c3afasfasjlajfklas"; 

var p = /(\w)(\d)\1\2/;

var result;

console.log(str.match(p));

console.log(p.exec(str))

 

得到结果是上面红色为1的数组。

 

 

 

理解test、exec和match方法都会改变RegExp对象的属性执行这些,如果反向应用都有,那RegExp的$!......到$9都会有值的,最简单的RegExp的index会改变。测试时发现就IE下RegExp有的属性FireFox和Ghrome下不一定有,并且就IE最特别了。像RegExp下的index和lastIndex都有,但是Firefox和Ghrome就没有。

 

讲一下方向引用,先看看下面的例子:

var str = "1234 5678";

var patt = /(\d{4}) (\d{4})/;

var newStr = str.replace(patt,"$2 $1");

console.log(newStr);

 

得到结果:

 

5678 1234

 

结合上面的例子。其实反向引用是正则表达式中有()分组的情况下,像(A?(B?(C?)))这样的正则表达式就有三组,则会有三个反向引用。

1:(A?(B?(C?)))

 

2:(B?(C?))

3:(C?)

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    javascript 中String.match()与RegExp.exec()的区别说明

    最近看了javascript权威指南 里面的正则部分,match和exec方法有一些相同点和不同点,在这里写一下加深一下印象

    javascript的正则匹配方法学习

    javascript中正则匹配有3个方法,match,exec,test。这些方法都跟字符串和RegExp对象有关,但使用场景不一样,容易混淆。match是字符串的一个方法,接收一个RegExp对象做为参数,其他的是RegExp对象的方法,接收一个...

    execall:在一个字符串中查找多个RegExp匹配项

    不必遍历RegExp#exec ,不可变的并且具有更好的结果格式。 安装 $ npm install execall 用法 import execAll from 'execall' ; execAll ( / ( \d + ) / g , '$200 and $400' ) ; /* [ { match: '200', ...

    javascript语言参考+教程 CHM

    exec 方法; exp 方法; fixed 方法; floor 方法; fontcolor 方法; fontsize 方法; fromCharCode 方法; getDate 方法; getDay 方法; getFullYear 方法; getHours 方法; getItem 方法; getMilliseconds ...

    微软JavaScript手册

    exec 方法 在指定字符串中执行一个匹配查找。 exp 方法 返回 e (自然对数的底) 的幂。 FileSystemObject 对象 提供对计算机文件系统的访问。 fixed 方法 将 HTML 的<TT> 标识添加到String 对象中的文本两端。 ...

    javascript文档

    exec 方法 在指定字符串中执行一个匹配查找。 exp 方法 返回 e (自然对数的底) 的幂。 FileSystemObject 对象 提供对计算机文件系统的访问。 fixed 方法 将 HTML 的<TT> 标识添加到String 对象中的文本两端。 ...

    JavaScript权威指南

    JavaScript权威指南 犀牛书 Chapter 1. Introduction to JavaScript Section 1.1. JavaScript Myths Section 1.2. Versions of JavaScript Section 1.3. Client-Side JavaScript Section 1.4. JavaScript ...

    正则表达式

    JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. 在JavaScript中,正则表达式是由一个RegExp对象表示的.当然,可以使用一个RegExp()构造函数来创建RegExp...

    Javascript正则表达式验证账号、手机号、电话和邮箱的合法性

    这些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、replace、search 和 split 方法。本章介绍 JavaScript正则表达式。 1、验证帐号是否合法 验证规则:字母、数字、下划线组成,字母开头,4-16位...

    js-sandbox-14:正则表达式-评估函数

    这些模式与RegExp的exec和test方法以及String的match , matchAll , replace , search和split方法一起使用。 本章介绍JavaScript正则表达式。 exec exec()方法执行对指定字符串中的匹配项的搜索。 返回...

    javascript正则表达式容易被忽略的小问题整理

    如果没有设置全局标识符g,那么调用string.match(regexp)的结果和调用regexp.exec(string)的结果是相同的, 但在设置了全局标识符g时,string.match(regexp)会把所有的匹配都放入结果数组中,regexp.e

    表单验证Validator v1.0(CHM) 下载

    Validator是基于JavaScript技术的伪静态类和对象的自定义属性,可以对网页中的表单项输入进行相应的验证,允许同一页面中同时验证多个表单,熟悉接口之后也可以对特定的表单项甚至仅仅是某个字符串进行验证。...

Global site tag (gtag.js) - Google Analytics