简介
ECMAScript 通过 RegExp 类型来支持正则表达式。
语法
使用下面类似 Perl 的语法,就可以创建一个正则表达式
var expression = / pattern / flags ;
模式(pattern):可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、 向前查找以及反向引用
标志(flags):用以标明正则表达式的行为,每个正则表达式都可带有一或多个
正则表达式的匹配模式支持下列 3 个标志:
g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止
i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写
m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项
定义方式
对象字面量
1、一个正则表达式就是一个模式与3 个标志的组合体。不同组合产生不同结果
例如:
/*
* 匹配字符串中所有"at"的实例
*/
var pattern1 = /at/g;
/*
* 匹配第一个"bat"或"cat",不区分大小写
*/
var pattern2 = /[bc]at/i;
/*
* 匹配所有以"at"结尾的 3 个字符的组合,不区分大小写
*/
var pattern3 = /.at/gi;
2、所有元字符都必须转义,正则表达式中的元字符包括:
( [ { \ ^ $ | ) ? * + .]}
例如:
/*
* 匹配第一个"bat"或"cat",不区分大小写
*/
var pattern1 = /[bc]at/i;
/*
* 匹配第一个" [bc]at",不区分大小写
*/
var pattern2 = /\[bc\]at/i;
/*
* 匹配所有以"at"结尾的 3 个字符的组合,不区分大小写
*/
var pattern3 = /.at/gi;
/*
* 匹配所有".at",不区分大小写
*/
var pattern4 = /\.at/gi;
构造函数
两个参数:一个是要匹配的字符串模式,另一个是可选的标志字符串
例如:
/*
* 匹配第一个"bat"或"cat",不区分大小写
*/
var pattern1 = /[bc]at/i;
/*
* 与 pattern1 相同,只不过是使用构造函数创建的
*/
var pattern2 = new RegExp("[bc]at", "i");
区别
在 ECMAScript 3 中, 正则表达式字面量始终会共享同一个RegExp 实例,而使用构造函数创建的每一个新 RegExp 实例都是一个新实例
例如:
var re = null,
i;
for (i=0; i < 10; i++){
re = /cat/g;
re.test("catastrophe");
}
for (i=0; i < 10; i++){
re = new RegExp("cat", "g");
re.test("catastrophe");
}
RegExp实例属性
RegExp 的每个实例都具有下列属性,通过这些属性可以取得有关模式的各种信息
global:布尔值,表示是否设置了 g 标志
ignoreCase:布尔值,表示是否设置了 i 标志
lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从 0 算起
multiline:布尔值,表示是否设置了 m 标志
source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回
例如:
var pattern1 = /\[bc\]at/i;
alert(pattern1.global); //false alert(pattern1.ignoreCase); //true alert(pattern1.multiline); //false alert(pattern1.lastIndex); //0
alert(pattern1.source); //"\[bc\]at"
var pattern2 = new RegExp("\\[bc\\]at", "i");
alert(pattern2.global); //false alert(pattern2.ignoreCase); //true alert(pattern2.multiline); //false alert(pattern2.lastIndex); //0
alert(pattern2.source); //"\[bc\]at"
//字面量和构造函数的source属性是相同的
RegExp实例方法
exec()
1、该方法接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回 null
2、返回的数组虽然是 Array 的实例,但包含两个额外的属性:index (表示匹配项在字符串中的位置)和 input(表示应用正则表达式的字符串)
例如:
var text = "mom and dad and baby";
var pattern = /mom( and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
//因为整个字符串本身与模式匹配,所以返回的数组 matchs 的 index 属性值为 0
alert(matches.index); // 0
alert(matches.input); // "mom and dad and baby" alert(matches[0]); // "mom and dad and baby" alert(matches[1]); // " and dad and baby" alert(matches[2]); // " and baby"
3、exec()即使在模式中设置了全局标志(g),它每次也只会返回一个匹配项,在不设置全局标志的情况下,在同一个字符串上多次调用 exec()将始终返回第一个匹配项的信息,而在设置全局标志的情况下,每次调用 exec()则都会在字符串中继续查找新匹配项
例如:
var text = "cat, bat, sat, fat";
var pattern1 = /.at/;
var matches = pattern1.exec(text); alert(matches.index); //0
alert(matches[0]); //cat alert(pattern1.lastIndex); //0
matches = pattern1.exec(text);
alert(matches.index); //0
alert(matches[0]); //cat alert(pattern1.lastIndex); //0
var pattern2 = /.at/g;
var matches = pattern2.exec(text); alert(matches.index); //0
alert(matches[0]); //cat alert(pattern2.lastIndex); //3
matches = pattern2.exec(text);
alert(matches.index); //5
alert(matches[0]); //bat alert(pattern2.lastIndex); //8
test()
该方法接受一个字符串参数。在模式与该参数匹配的情况下返回 true;否则,返回 false。经常被用在 if 语句中,判断目标字符串与某个模式是否匹配
例如:
var text = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/;
if (pattern.test(text)){
alert("The pattern was matched.");
}
toLocaleString()和 toString()
该方法返回正则表达式的字面量,与创 建正则表达式的方式无关
例如:
var pattern = new RegExp("\\[bc\\]at", "gi");
alert(pattern.toString()); // /\[bc\]at/gi alert(pattern.toLocaleString()); // /\[bc\]at/gi
RegExp构造函数属性
RegExp 构造函数包含一些属性。这些属性适用于作用域中的所有正则表达式,并且基于所执行的最近一次正则表达式操作而变化
这些属性分别有一个长属性名和一个短属性名(Opera 是例外,它不支持短属性名)
长属性名 | 短属性名 | 说明 |
---|---|---|
input | $ | |
lastMatch | $& | 最近一次的匹配项 |
lastParen | $+ | 最近一次匹配的捕获组 |
leftContext | $` | input字符串中lastMatch之前的文本 |
multiline | $* | 布尔值,表示是否所有表达式都使用多行模式 |
rightContext | $’ | Input字符串中lastMatch之后的文本 |
例如:
var pattern = /(.)hort/g;
/*
* 注意:Opera 不支持 input、lastMatch、lastParen 和 multiline 属性
* Internet Explorer 不支持 multiline 属性
*/
if (pattern.test(text)){
alert(RegExp.input); // this has been a short summer
alert(RegExp.leftContext); // this has been a
alert(RegExp.rightContext); // summer
alert(RegExp.lastMatch); // short
alert(RegExp.lastParen); // s
alert(RegExp.multiline); // false
if (pattern.test(text)){
alert(RegExp.$_); // this has been a short summer
alert(RegExp["$`"]); // this has been a
alert(RegExp["$'"]); // summer
alert(RegExp["$&"]); // short
alert(RegExp["$+"]); // s
alert(RegExp["$*"]); // false
}
还有多达 9 个用于存储捕获组的构造函数属性。访问这些属性的语 法是 RegExp.$1、RegExp.$2…RegExp.$9,分别用于存储第一、第二……第九个匹配的捕获组。在 调用 exec()或 test()方法时,这些属性会被自动填充
例如:
var text = "this has been a short summer"; var pattern = /(..)or(.)/g;
if (pattern.test(text)){
alert(RegExp.$1); //sh
alert(RegExp.$2); //t }
总结
1、ECMAScript通过RegExp类型来支持正则表达式,由模式和标志组成
2、标志主要是g,i和m
3、定义正则表达式的方法有两种,分别是以字面量形式和使用RegExp构造函数
4、RegExp实例属性可以取得有关模式的各种信息
5、RegExp实例方法主要有两种——exec()和test(),其中exec()主要用于捕获,test()主要用于验证
6、RegExp构造函数属性有一个长属性名和一个短属性名,Opera不支持短属性名
参考
《JavaScript高级程序设计(第3版)》