前面已经介绍过javascript中正则表达式的基础语法。javascript的RegExp类表示正则表达式,String和RegExp都定义了方法,使用正则表达式可以进行强大的模式匹配和文本检索与替换。本文将介绍正则表达式的RegExp对象,以及正则表达式涉及
到的属性和方法
对象
javascript中的正则表达式用RegExp对象表示,有两种写法:一种是字面量写法;另一种是构造函数写法
Perl写法
正则表达式字面量写法,又叫Perl写法,因为javascript的正则表达式特性借鉴自Perl
正则表达式字面量定义为包含在一对斜杠(/)之间的字符,并且可以设置3个标志
var expression = /pattern/flags;
正则表达式的匹配模式支持下列3个标志:
g: 表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止
i: 表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写
m: 表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项
//匹配字符串所有'at'的实例 var p = /at/g; //test()方法返回一个布尔值表示是否可以找到匹配项 console.log(p.test('ata'));//true console.log(p.test('aba'));//false
RegExp构造函数
和普通的内置对象一样,RegExp正则表达式对象也支持new+RegExp()构造函数的形式
RegExp构造函数接收两个参数:要匹配的字符串模式(pattern)和可选的标志字符串(flags),标志字符串和字面量的三个标志含义相同:'g'、'i'、'm'
RegExp构造函数的两个参数都是字符串。且使用字面量形式定义的任何表达式都可使用构造函数
//匹配字符串所有'at'的实例 var p1 = /at/g; //同上 var p2 = new RegExp('at','g');
[注意]ECMAScript3规范规定,一个正则表达式直接量会在执行到它时转换为一个RegExp对象,同一段代码所表示正则表达式直接量的每次运算都返回同一个对象。ECMAScript5规范则做了相反的规定,同一段代码所表示的正则表达式直接量的每次
运算都返回新对象。IE6-8一直是按照ECMAScript5规范的方式实现的,所以并没有兼容性问题
由于正则表达式字面量并不支持变量,所以如果正则表达式中出现变量只能使用RegExp构造函数以字符串拼接的形式,将变量拼接到RegExp构造函数的参数中
【tips】通过类名classname获取元素
function getByClass(obj,classname){ var elements = obj.getElementsByTagName('*'); var result = []; var pattern = new RegExp( '(^|\\s)'+ classname + '(\\s|$)'); for(var i = 0; i < elements.length; i++){ if(pattern.test(elements[i].className)){ result.push(elements[i]); } } return result; }
实例属性
每个RegExp实例对象都包含如下5个属性
global: 布尔值,表示是否设置了g标志 ignoreCase: 布尔值,表示是否设置了i标志 lastIndex: 整数,表示开始搜索下一个匹配项的字符位置,从0算起 multiline: 布尔值,表示是否设置了标志m source: 正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回
var pattern = new RegExp('\\[bc\\]at','i'); console.log(pattern.global);//false console.log(pattern.ignoreCase);//true console.log(pattern.multiline);//false console.log(pattern.lastIndex);//0 console.log(pattern.source);//'\[bc\]at'
如果使用RegExp的exec()或test()函数,并且设定了全局模式'g',正则表达式的匹配就会从lastIndex的位置开始,并且在每欠匹配成功之后重新设定lastIndex。这样,就可以在字符串中重复迭代,依次寻找各个匹配结果。但是,如果需要对不同字符串调用同一个RegExp的exec()或test()方法,这个变量也也可能会带来意料之外的匹配结果,所以在更换字符串时,要显式地将RegExp的lastIndex置为0
//exec()方法以数组形式返回匹配项 var p = /\w/g; var s = 'ab'; console.log(p.lastIndex);//0 console.log(p.exec(s));//['a'] console.log(p.lastIndex);//1 console.log(p.exec(s));//['b'] console.log(p.lastIndex);//2 console.log(p.exec(s));//null console.log(p.lastIndex);//0
var p = /\w/g; var s1 = 'ab'; var s2 = 'ba'; console.log(p.lastIndex);//0 console.log(p.exec(s1));//['a'] console.log(p.lastIndex);//1 console.log(p.exec(s2));//['a'] console.log(p.lastIndex);//2
构造函数属性
RegExp构造函数属性被看成静态属性,这些属性基于所执行的最近一次正则表达式操作而变化
有两种方式访问它们,即长属性名和短属性名。短属性名大都不是有效的ECMAScript标识符,所以必须通过方括号语法来访问它们