js中使用正则表达式(二)操作正则表达式的对象RegExp、String和方法

操作正则表达式执行匹配工作的对象:RegExp对象和String对象,
接下来分别介绍一下两个对象提供正则匹配的方法
1、RegExp对象:可以通过上面两种方式创建正则表达式对象,
它有3个方法:test()、exec() 以及 compile()。
(1)、test():检索字符串中的指定值。返回值是 true 或 false。
例子:

        var regx=new RegExp("e");
        document.write(regx.test("The best things in life are free")); 
    由于该字符串中存在字母 "e",以上代码的输出将是:true

(2)、exec():该方法是专门为捕获组而设计的。
    返回值:包含第一个匹配项信息的数组,如果未找到匹配,则返回值为 null。

    返回的虽然是Array实例,但包含两个额外的属性:
    index和input,index表示匹配项在字符串中开始的位置,input表示的是应用正则表达式的字符串。

    数组的第一项是与整个模式匹配的字符串,其它项是与模式中捕获组匹配的字符串,
    如果模式中没有捕获组,则该数组中只有一项,即与整个模式匹配的字符串。

    例子:
        var text = "mon and dad and baby,the end.";
        var regx= /mon( and dad( and baby)?)?/;
        var matches = regx.exec(text);
        console.log(matches);//["mon and dad and baby", " and dad and baby", " and baby", index: 0, input: "mon and dad and baby,the end."]或者alert时为mon and dad and baby, and dad and baby, and baby
        alert(matches.index);//0
        alert(matches.input);//mon and dad and baby,the end. 即text的值:被检索的字符串
        alert(matches[0]);//mon and dad and baby 即成功匹配到的字符串
        alert(matches[1]);//and dad and baby 即第一个捕获组
        alert(matches[2]);//and baby 即第二个捕获组

    如果没有捕获组:
        var regx=/user\d/g;
        var str="user13userddduser345";
        var match = regx.exec(str);
        console.log(match);//["user1", index: 0, input: "user13userddduser345"]
补充:

    当 regx 是一个全局正则表达式时:
    1、必须是正则表达式而非普通字符串;
    2、必须是全局的,当执行 exec() 找到了与表达式相匹配的文本时,
        在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。
    这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。
    当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。

    简单点就是:匹配模式p1必须是正则表达式,检索条件p2必须有g,然后循环执行,
    如果不满足正则表达式且全局的条件,多次执行exec都返回第一个匹配项字符串
    例如:
        var regx= new RegExp("user\\d","g");
        var rs=null;
        while((rs=regx.exec("ddduser1dsfuser2dd")) != null){
            console.log(rs);
        }
        则rs的值分别为:
            ["user1", index: 3, input: "ddduser1dsfuser2dd"]或者alert时为user1、
            ["user2", index: 11, input: "ddduser1dsfuser2dd"]或者alert时为user2
        注:如果没有捕获组,可以直接使用rs的值,即为匹配值,不通过数组方法

    如果去掉参数g:
        var regx= new RegExp("user\\d");
            var rs=null;
            while((rs=regx.exec("ddduser1dsfuser2dd")) != null){
                console.log(rs);
            }
            则rs的值分别为:
                ["user1", index: 3, input: "ddduser1dsfuser2dd"]或者alert时为user1、
                ["user1", index: 3, input: "ddduser1dsfuser2dd"]或者alert时为user1
            循环执行结果一致
(3)、compile():用于在脚本执行过程中编译正则表达式,
    也可用于改变和重新编译正则表达式,及添加或删除第二个参数。

    格式:RegExpObject.compile(regx,modifier);
    参数: regx:正则表达式。
        modifier:规定匹配的类型。
        "g" 用于全局匹配,
        "i" 用于区分大小写,
        "gi" 用于全局区分大小写的匹配。
    例子:
        var str="Every man in the world! Every woman on earth!";

        regx=/man/g;
        str2=str.replace(regx,"person");
        document.write(str2+"<br />");

        regx=/(wo)?man/g;
        regx.compile(regx);
        str2=str.replace(regx,"person");
        document.write(str2);
    在字符串中全局搜索 "man",并用 "person" 替换。
    然后通过 compile() 方法,改变正则表达式,用 "person" 替换 "man" 或 "woman"。

2、String对象:需要使用正则字面量的方式创建正则表达式对象regx,
用以作为String调用相关方法的参数,方法有:match(regx)、search(regx)、replace(regx,str)、split(regx)

(1)、match(regx/searchStr),返回与regx或searchStr相匹配的一个字符串数组,
    如果没有加参数g,则返回第一个匹配,以及捕获组匹配项,同时也有额外的input属性和index属性,加入参数g则返回所有的匹配,但不包括捕获组匹配项、index、input属性。
    例子:
        带有g:
            var regx=/us(er)\d/g;
            var str="user13userddduser345";
            var rs=str.match(regx);
            console.log(rs);
            rs的值为:["user1", "user3"]
        注:这个是和exec()方法不同的地方

        如果没有g:
            var regx=/us(er)\d/;
            var str="user13userddduser345";
            var rs=str.match(regx);
            console.log(rs);
            //["user1", "er", index: 0, input: "user13userddduser345"]或者alert为user1

            var rs1=str.match(regx);
            console.log(rs1);
            //["user1", "er", index: 0, input: "user13userddduser345"]或者alert为user2
        注:两次结果一致,这个是与exec()不同的地方
**【注意:在全局检索模式下,match() 即不提供与子表达式匹配的文本的信息,也不声明每个匹配子串的位置。
    如果您需要这些全局检索的信息,可以使用 RegExp.exec()。】这样的解释是错误的。**


(2)、search(regx),返回字符串中与regx相匹配的子字符串起始位置的index值。
    例子:
        var regx=/user\d/g;
        var str="user13userddduser345";
        var rs=str.search(regx);
        rs的值为:0
(3)、replace(regx,str),将字符串中匹配regx的部分替换为str。
    另外在replace方法中,str中可以含有一种变量符号$,格式为$n,
    代表匹配中被记住的第n的匹配字符串(注意小括号可以记忆匹配)。
        例子:
        var regx=/user\d/g;
        var str="user13userddduser345";
        var rs=str.replace(regx,"00");
        rs的值为:003userddd0045

        例子2var regx=/u(se)r\d/g;
        var str="user13userddduser345";
        var rs=str.replace(regx,"$1");
        rs的值为:se3userdddse45
补充:对于replace(regx,str)方法还要特别注意一点,
    全局正则替换:如果regx是一个表达式对象则会进行全局替换
    (此时表达式必须附加参数g,否则也只是替换第一个匹配),
    如果regx是一个字符串对象,则只会替换第一个匹配的部分
        例子3var regx="user"
        var str="user13userddduser345";
        var rs=str.replace(regx,"00");
        rs的值为: 0013userddduser345
(4)、split(regx),将字符串以匹配regx的部分做分割,返回一个数组,
而且表达式是否附加参数g都没有关系,结果是一样的。
        例子:
        var regx=/user\d/g;
        var str="user13userddduser345";
        var rs=str.split(regx);
        rs的值为:{3userddd,45}
补充:
    (1)、stringObject.split(separator,howmany),
        separator也可以是普通字符串,howmany作为可选参数,指定返回的数组的最大长度。
    (2)、如果把空字符串 ("") 用作 separator,那么stringObject每个字符之间都会被分割。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值