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
方法返回的数组有三个属性:input、index和lastIndex。Input
属性包含整个的被查找字符串。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); } 得到结果为:
理解如果正在表达式不是全局的这是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控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
-
Javascript中类式继承和原型式继承的实现方法和区别之处
-
C#中Byte[]和String之间转换的方法
-
详解Javascript百度地图接口开发文档中的类和方法
-
正则表达式语法规则及在Javascript和C#中的使用方法
-
Js中的字符串String的常用方法和注意点
-
JavaScript中的window对象的属性和方法;JavaScript中如何选取文档元素
-
彻底搞懂JavaScript中的apply和call方法(必看)
-
JavaScript中的获取对象宽高等属性的方法和区别对比讲解
-
JavaScript中的call方法和apply方法使用对比