ECMAScript海拔5.4 RegExp类型

//匹配第一个"bat"或"cat",不区分大小写
    var pattern1=/[bc]at/i;

    //匹配第一个"[bc]at/i",不区分大小写
    var pattern2=/\[bc\]at/i;

    //匹配所有以"at"结尾的3个字符的组合,不区分大小写
    var pattern3=/.at/gi;

    //匹配所有".at",不区分大小写
    var pattern4=/\.at/gi;

前边举的这一个事例都以以字面量方式来定义的正则表达式.另1种创制正则表明式的不二秘诀是选拔RegExg构造函数,它接受八个参数:一个要协作的字符串情势,另三个是可选的评释字符串.

exec()接受3个参数,即要应用格局的字符串,然后重返包罗第三个门户大致项新闻的数组;或许在平昔不相称项的情景下重临null.

雷克斯Exp实例承袭的toLocaleString()和toString()方法都会回去正则表达式的字面量,与创建正则表明式的法子非亲非故.

下表给出壹些方式,右边为那么些形式的字面量表示,右侧为运用RegExp构造函数定义同样情势时选择的字符串.

我们注意到,固然第3个方式采取是字面量,第四个形式应用了RegExp构造函数,但它们的source属性是同样的.可知,source属性保存的是正统形式的字符串,即字面量情势所用的字符串.

 

下表列出了RegExp构造函数的属性.

source:正则说明式的字符串表示,依据字面量情势而非传入构造函数中的字符串情势再次来到.

g:表示全局(global)形式,即情势将被利用于具备字符串,而非在意识第伍个相配项时马上终止;

出于RegExp构造函数的形式参数是字符串,由此有个别景况下要对字符实行再一次转义.

命名的捕获组;(但补助理编辑号的捕获组)

正则表明式的相称情势帮助上面一个标识.

RegExp的每一种实例都具有下列属性,通过那几个属性能够赢得有关格局的种种消息.

上边列出了ECMAScript正则表明式不帮衬的表征:

lastIndex:整数,表示初始寻觅下贰个相配项的字符地点,从0算起.

lastMatch属性再次回到近来3遍与整个正则表明式相配的字符串,即short;

能够应用字面量定义的别的说明式,都能够利用构造函数来定义,如下例子:

纵然ECMAScript中的正则表明式成效照旧相比齐全的,但依然不够有些语言(尤其是Perl)所支撑的高等正则表明式性情.

那些元字符在正则表明式中都有壹种或八种多途,由此一旦想要相配字符串的隐含的这几个字符,就务须对它们进行转义.

 

具备元字符都必须另行转义,那个早已转义过的字符也是这么,例如\n(字符\在字符串中司空眼惯被转义为\\,而在正则表明式字符串就会形成\\\\).

在率先个巡回中,纵然是循环体中内定的,但实际上只为/cat/制造了一个RegExp实例.
由于实例属性不会重新初始化,所以在循环中重复调用test()方法会战败.那是因为第三遍调用test()找到了”cat”,但第叁次调用是从索引为叁的字符(上一回相配的末梢)先导的,所以就找不到它了.由于会测试到字符串末尾,所以下三次再调用test()就又从上马开始了.

那种用法日常出现在验证用户输入的处境下,因为我们只想领悟输入是否有效,至于它为什么无效就无关首要了.

var pattern=new RegExp("\\[bc\\]at","gi");
    console.log(pattern.toString());// /\[bc\]at/gi
    console.log(pattern.toLocaleString());// /\[bc\]at/gi

ECMAScript通过RegExp类型来支撑正则表达式.

而在装置全局标记的景观下,每便调用exec()则都会在字符串中再三再四查找新相称项,如下边例子所示:

5.四.1 RegExp实例属性

专注:正则表明式的valueOf()方法重临正则表达式自己.

应用这一个属性能够从exec()或test()实施的操作中领到出更切实的新闻.

长属性名 短属性名 说明 
input $_ 最近一次要匹配的字符串.Opera未实现此属性
lastMatch $& 最近一次的匹配.Opera未实现此属性
lastParen $+ 最近一次匹配的捕获组.Opera未实现此属性
leftContext $` input字符串中lastMatch之前的文本
multiline $* 布尔值,表示是否所有表达式都使用多行模式.IE和Opera未实现此属性
rightContext $’ Input字符串中lastMatch之后的文本

经过这几个属性能够获知四个正则表明式的各方面的音讯,但却未曾多大用处,因为那个消息都富含在形式注解中.例如

在地点例子中,pattern1相称第1个”bat”或”cat”,不区分轻重缓急写.而想要直接相称”[bc]at”,将在对多少个方括号进行转义.对于pattern叁,句号表示位于”at”从前的任性二个足以构成匹配项的字符.假使想相称”.at”,就不可能不对钟点自己进行转义.

 

只顾:IE的JavaScript达成在lastIndex属性上设有过错,固然在非全局格局下,lastIndex属性每一趟也会变化.

要留意的是,传递给RegExp构造函数的五个参数都以字符串(无法把正则表明式字面量传递给RegExp构造函数).

别的,还要小心形式的lastIndex属性的变型情状.
在全局匹配情势下,lastIndex的值在历次调用exec()后都会大增,而在非全局方式下则一向维持不变.

并集和交集类;

input属性重回了原始字符串;

对于exec()方法来说,尽管在形式中装置了大局标志(g),它每一回也只会重返3个同盟项.

在那么些例子中,第四个情势pattern一不是全局方式,由此老是调用exec()重临的都以首先个匹配项(“cat”).而第一个形式pattern2是全局方式,因而老是调用exec()都会回来字符串中的下二个相配项,直到搜索到字符串末尾停止.

 

global:布尔值,表示是还是不是设置了g标识.

所以,test()方法通常被用在if语句中,如上面例子所示:

 

m:表示多行(multiline)方式,即在达到1行文本末尾时还会继续搜寻下一行中是还是不是留存与方式匹配的项.

种种正则表达式都可含蓄1或七个标识(flags),用以标明正则表达式的行为.

i:表示不区分轻重缓急写(case-insensitive)格局,即在明确匹配项时忽略格局与字符串的深浅写;

向后搜索(lookbehind);(但一心支持向前查找lookhead)

换句话说,这几个属性分别有一个长属性名和1个短属性名(Opera是差别,它不支持短属性名)

在不设置全局标识的意况下,在同贰个字符串上频仍调用exec()将一向重返第1个相称项的音信.

此处开创了3个暗含五个捕获组的形式,并用该情势测试了三个字符串.就算即便test()方法只回去2个布尔值,但RegExp构造的函数的天性$1和$2也会被匹配相应捕获组的字符串自填充.

 

Unicode帮助(单个字符除了那几个之外,如\uFFFF);

例如:

 

下一场就足以像上面来选取它们:

 

var text="this has been a short summer";
    var pattern=/(.)hort/g;

    //注意:Opera不支持input,lastMatch,lastParen和multiline属性
    //Internet Rxplorer不支持multiline属性
    if(pattern.test(text)){
        console.log(RegExp.input);//this has been a short summer
        console.log(RegExp.leftContext);//this has been a 
        console.log(RegExp.rightContext);//summer
        console.log(RegExp.lastMatch);//s
        console.log(RegExp.lastParen);//false
        console.log(RegExp.multiline);
    }

选用正则表明式字面量和选择RegExp构造函数创设的正则表明式分裂样.在ECMASscript
三中,正则表明式字面量始终会共享同1个RegExp实例,而选拔构造函数创立的每三个新RegExp实例都以三个新实例.看上边例子

IE+,FF四+和Chrome都由此做出了修改.

相配字符串起首和终极的\A和\Z锚;(但支撑以插入符号^和日币符号$来相配字符串的开头和最终)

伍.4.贰 RegExp实例方法

如上边例子:

ignoreCase:布尔值,表示是或不是设置了i标记.

 

leftContext属性重返了单词short在此之前的字符串,而rightContext属性则赶回了short之后的字符串

第二个循环利用RegExp构造函数在历次循环中创设正则表明式.因为每一回迭代都会创制二个新的RegExp实例,所以每一回调用test()都会回到true.

在数组中,第二项是与总人体模型式相称的字符串,别的项是与形式中的捕获组相配的字符串(即使形式中并未有捕获组,则该数组只包蕴1项).

5.4.肆 格局的局限性

纵使上例中的方式是通过调用RegExp构造函数成立的,但toLocaleString()和toString()方法还是会像它是以字面量情势创立的同一呈现其字符串表示.

行使上边好像Perl的语法,就足以创立叁个正则表达式.

归来的数组尽管是Array的实例,但含有八个附加的性子:index和input.

RegExp对象的重中之重方法是exec(),该办法是特地为捕获组而规划的.

5.肆.3 RegExp构造函数属性

在那个事例中,用正则表明式来测试3个数字系列.假若输入文本与格局相配,则显得一条新闻.

//匹配第一个"bat"或"cat",不区分大小写
    var pattern1=/[bc]at/i;

    //与pattern1相同,只不过是使用构造函数创建的
    var pattern2=new RegExp("[bc]at",i);

RegExp构造函数包蕴部分品质(这么些属性在其他语言中被当做是静态属性).那几个属性适用于成效域中的全数正则表达式,并且依据所实施的结尾一回正则表明式操作而变化.

正则表明式的元字符包含:

当中的方式(pattern)部分能够是其余简单的或复杂的正则表达式,能够包罗字符类,限定符,分组,向前查找以及反向引用.

原子组(atomic grouping);

var text="cat,bat,sat,fat";
    var pattern1=/.at/;

    var matches=pattern1.exec(text);
    console.log(matches.index);//0
    console.log(matches[0]);//cat
    console.log(pattern1.lastIndex);//0

    matches=pattern1.exec(text);
    console.log(matches.index);//0
    console.log(matches[0]);//cat
    console.log(pattern1.lastIndex);//0

    var pattern2=/.at/g;

    var matches=pattern2.exec(text);
    console.log(matches.index);//0
    console.log(matches[0]);//cat
    console.log(pattern2.lastIndex);//3

    matches=pattern2.exec(text);
    console.log(matches.index);//4
    console.log(matches[0]);//bat
    console.log(pattern2.lastIndex);//7

ECMAScipt
四明显规定,使用正则表达式字面量必须您间接调用RegExp构造函数同样,每一回都创立新的RegExp实例.

RegExp构造函数的顺序属性重临了下列值:

 

与其他语言中的正则表明式类似,形式中央银行使的有着元字符都必须转义.

如前所述,例子使用的长属性名都得以用相应的短属性名来替代.只可是,由于那几个短属性名大都不是立竿见影的ECMAScript标记符,因而必须通过方括号语法来访问它们,如下所示.

 

正则表明式注释;

至于这么些属性的另2个非正规之处,便是足以透过两种艺术来拜访它们.

lastParen属性重回近来3回匹配的捕获组,即例子中的s.

从而,贰个正则表达式正是叁个方式与上述二个标记的3结合体.分化组合产生分裂的结果.

字面量模式 等价的字符串
/\[bc\]at/ “/\\[bc\\]at/”
/\.at/ “/\\.at/”
/name\/age/ “/name\\/age/”
/\d.\d{1,2}/ “/\\d.\\d{1,2}/”
/\w\\hello\\123/ “/\\w\\\\hello\\\\123/”
var expression=/pattern/flags;

正则表明式的第二个主意是test(),它接受3个字符串参数.在方式与该参数相配的气象下重回true;不然,再次回到false.在只想掌握对象字符串与有个别形式是不是合营,但不供给了解其文件内容的情形下,使用这几个点子丰盛方便.

那边的patttern壹和pattern二是多个完全等价的正则表明式.

var re=null;
        i;

    for(var i=0;i<10;i++){
        re=/cat/g;
        re.test("catastrophe");
    }

    for(var i=0;i<10;i++){
        re=new RegExp("cat","g");
        re.test("catastrophe");
    }
//匹配字符串的所有"at"的实例
    var pattern1=/at/g;

    //匹配第一个"bat"或"cat",不区分大小写
    var pattern2=/[bc]at/i;

    //匹配所有以"at"结尾的3个字符的组合,不区分大小写
    var pattern3=/.at/gi;
var test="this has a short summer";
    var pattern=/(..)or(.)/g;
    if(pattern.test(text)){
        console.log(RegExp.$1);//sh
        console.log(RegExp.$2);//t
    }

在这之中index表示相配项在字符串的岗位,而input表示应用正则表明式的字符串.

而外上边介绍的多少个属性之外,还有多达7个用于存储捕获组的构造函数属性.访问这几个属性的语法是RegExp.$壹,RegExp.$2……RegExp.$玖,分别用于存款和储蓄第2,第3…第几个非凡的破获组.在调用exec()和test()方法时,那个属性会被自动填充.

var text="this has been a short summer";
    var pattern=/(.)hort/g;

    //注意:Opera不支持input,lastMatch,lastParen和multiline属性
    //Internet Rxplorer不支持multiline属性

    if(pattern.test(text)){
        console.log(RegExp.$_);//this has been a short summer
        console.log(RegExp["$`"]);//this has been a 
        console.log(RegExp["$'"]);//summer
        console.log(RegExp["$&"]);//short
        console.log(RegExp["$+"]);//s
        console.log(RegExp["$*"]);//false

s(single,单行)和x(free-spacing,无距离)相配格局;

( [ { \ ^ $ | ) ? * + . ] }

var pattern1=/\[bc\]at/i;

    console.log(pattern1.global);//false
    console.log(pattern1.ignoreCase);//true
    console.log(pattern1.multiline);//false
    console.log(pattern1.lastIndex);//0
    console.log(pattern1.source);// \[bc\]at

    var pattern2=new RegExp("\\[bc\\]at","i");
    console.log(pattern2.global);//false
    console.log(pattern2.ignoreCase);//true
    console.log(pattern2.multiline);//false
    console.log(pattern2.lastIndex);//0
    console.log(pattern2.source);// \[bc\]at
var text="000-00-0000";
    var pattern=/\d{3}-\d{2}-\d{4}/;

    if(pattern.test(text)){
        console.log("The pattern was matched.");
    }

multiline:布尔值,表示是或不是设置了m标记.

 

如上代码创制了三个格局,相称任何1个字符后跟hort,而且把第1个字符放在了三个捕获组中.

即是存在那么些限制,ECMAScript正则表明式还是是11分强劲的,能够帮大家做到绝大许多情势相称职分.

原则相当;