JavaScript高级程序设计6.pdf
ECMAScript通过RegExp类型来支持正则表达式
var expression=/pattern/flags;其中模式(pattern)部分是正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。每个正则表达式都可以带有一或多个标志(flags),用以标明正则表达式的行为
正则表达式的匹配模式支持3个标志:
g:表示全局(global)模式,应用于所有字符串,而非发现第一个就立即停止;
i:表示不区分大小写(case-insensitive)模式,匹配项时忽略模式与字符串的大小写;
m:表示多行(multiline)模式,到达一行的文本末尾时还会继续查找下一行;
var pattern1=/at/g;
var pattern2=/[bc]at/i;
var pattern3=/.at/gi;
所有的元字符都必须转义(、)、{、}、[、]、\、?、.、+、*、^、$、|
var pattern1=/\[bc\]at/i
除了字面量形式定义正则表达式,还可以使用RegExp构造函数,它接收两个参数,一个是要匹配的字符串模式,另一个是可选的标志字符串
var pattern1=/[bc]at/i;
var pattern2=new RegExp("[bc]at","i");
由于构造函数里使用的是字符串,所以要对所有元字符进行双重转义 字面量:/\[bc\]at/ 字符串:"\\[bc\\]at" 字面量:/\w\\hello\\123/ 字符串:"\\w\\\\hello\\\\123"
在ECMAScript中正则表达式字面量始终共享一个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实例属性
global:布尔值,是否设置了g标志
ignoreCase:布尔值,是否设置了i标志
lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起
multiline:布尔值,是否设置了m标志
source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回
var pattern1=/\[bc\]at/i;
alert(pattern1.global); //false
......
alert(pattern1.source); //"\[bc\]at"
RegExp对象的主要方法是exec(),它接受一个参数即要应用模式的字符串。然后返回包含第一个匹配项信息的数组,没有匹配项的情况下返回null
返回的数组是Array的实例,包含两个额外的属性index和input,index表示匹配项在字符串中的位置,而input表示应用正则表达式的字符串
var text="mom and dad and baby";
var pattern=/mom(and dad(and baby)?)?/gi;
var matches=pattern.exec(text);
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"
正则表达式的第二个方法是test(),它接受一个字符串参数,在该模式与该参数匹配的情况下返回true,用在if语句很方便
var text="000-00-0000";
var pattern=/\d{3}-\d{2}-\d{4}/;
if(pattern.test(text))
{
alert("The pattern was matched.");
}
RegExp构造函数包含一些属性,这些属性适用于作用域中的所有正则表达式,有两种方式访问它们
长属性名 短属性名 说明
input $_ 最近一次要匹配的字符串
lastMatch $& 最近一次的匹配项
lastParen $+ 最近一次匹配的捕获组
leftContext $` input字符串中lastMatch之前的文本
multiline $* 布尔值,是否使用多行模式
rightContext $' input字符串中lastMatch之后的文本
alert(RegExp.input); //...
......
ECMAScript中的正则表达式缺少一些如Perl所支持的高级正则表达式特性,却是够用了
-------------------------------------------------------------------------每天一点点-----------------------------------------------------------------------------------