JS基础6

作者: pp_5793 | 来源:发表于2018-10-31 21:50 被阅读0次

    正则表达式

    定义:它是一个描述字符模式的对象。Javascript的ReExp类表示正则表达式,String 和ReExp都定义了方法,后者使用正则表达式进行强大的模式匹配和文本搜索与替换的能力。
    (1)正则表达式直接量定义为包含在一对斜杠之间的字符

    var patter=/s$/;
    

    运行以上代码,会创建一个新的ReExp对象,并将它赋值给变量patter,这个ReExp对象是用来匹配所有以“s”结尾的字符串。
    (2)用构造函数ReExp()也可以定义与上面代码中等价的正则表达式:

    var pattern=new ReExp("s$");
    

    正则表达式的模式规则是由一个字符序列组成的,包括所有字母和数字组成,大多数的字符都是看作是待匹配的字符,比如/java/可以匹配任何包括“java”的字符串。还有一些特殊的字符,比如上面看到的/s$/中的/$/就表示是匹配字符串的结尾。

    字符类

    将直接量单独放在方括号内据组成了字符类,一个字符类可以匹配它所包含的任意字符。因此正则表达式/[a b c]/就和字母"a","b","c"中的任何一个都匹配。另外,可以通过"^"符号来否定字符类,它匹配所有不包含在方括号内的字符:/[^abc]/匹配的是除"a","b",
    "c"之外的所有字符。字符类可以使用连字符来表示字符范围,例如/[a-z]/,就表示匹配的是所有小写字母,/[a-zA-Z0-9]/则表示匹配所有拉丁字母以及数字。

    重复

    用刚刚学会的正则表达式的语法,可以把两位数表达成/\d\d/(\d表示0到9的数字)。
    正则表达式的重复字符语法
    (1){n,m}:表示匹配前一项至少n次,但是不能超过m次。
    (2){n,}:匹配前一项n次或者更多次
    (3){n}:匹配前一项n次
    (4)?:匹配前一项0次或1次
    (5)+:匹配前一项1次或多次
    (6)*:匹配前一项0次或多次
    注意上例都是向前匹配的
    eg:

    /\d{2,4}/: 匹配两到四个数字。
    /\w{3}\d?/:精确匹配三个单词和一个可选的数字。
    /\s+java\s+/:匹配前后带有一个或多个空格的字符串“java”。
    /[^(]*/:匹配0个或多个非左括号的字符。
    注意在使用?和 * 时要注意,它两允许啥也不匹配,也就是满足任意值也可以。

    正则表达式的选择、分组和引用

    (1)字符"|"用于分隔供选择的字符。
    /ab|cd|ef/可以匹配字符串“ab”或"cd"或"ef"。
    (2)圆括号
    作用1 :把单独的项组合成子表达式,以便可以像处理一个独立的单元那样用"|","*","+"或者"?"等对圆括号内的项进行处理。
    作用2:在完整的模式中定义子模式。
    作用3:允许在同一个正则表达式的后面引用前面的子表达式。
    |:选择
    (...):组合,将几个项组合为一个单元,这个单元可以通过各种匹配符,也可以记住和这个组合相匹配的字符串以供将来的使用。
    (?:...):只组合,不提供记忆
    \n和第n个分组第一次匹配的字符相匹配,组是圆括号中的表达式(也可能是嵌套的),组索引是从左到右的左括号数,“(?:”形式的不编码。

    指定匹配位置

    锚字符
    ^:匹配字符串的开头,在多行检索中,只匹配一行的开头
    $:匹配字符串的结尾,在多行检索中,只匹配一行的结尾
    \b:匹配一个单词的边界,简言之,就是位于字符\w和\W的位置,或位于字符\w和字符串开头或结尾的位置。和前面提到的[\b]区别开,[\b]匹配的是退格符
    \B:匹配非单词边界的位置
    (?=p):先行断言,括号里面的p不会匹配到,但是会匹配到在p之前的内容:

    var m ='abc'.match(/b(?=c)/);
    console.log(m);
    

    输出:

    [ 'b', index: 1, input: 'abc', groups: undefined ]
    [Finished in 0.6s]
    

    以上代码可以看出m匹配到的是b,从而验证上面的解释。
    (?!p):先行否定断言,与上面的用法相反,它是用来匹配前面的字符不存在的符号。
    匹配后面没有百分号的数字(%也不用返回):

    /\d+(?!%)/   
    

    修饰符

    修饰符一般放在正则表达式的最后面:
    var regex=/text/g;(修饰一个字符)
    var regex=/text/ig;(修饰多个字符)
    (1)g修饰符:全局修饰符
    用法:

    var regex = /b/g;
    var str = 'abba';
    
    regex.test(str); // true
    regex.test(str); // true
    regex.test(str); // false
    

    上面代码中,正则模式含有g修饰符,每次都是从上一次匹配成功处,开始向后匹配。因为字符串abba只有两个b,所以前两次匹配结果为true,第三次匹配结果为false。
    (2)i修饰符:可以使字符串不再区分字母大小。直接放在正则表达式后面
    (3)m修饰符:该修饰符表示多行模式。
    在有^$在的地方可使用在正则表达式的后面加上该修饰符,表示可以忽略对换行的匹配:

    /world$/.test('hello world\n') // false
    /world$/m.test('hello world\n') // true
    

    RegExp实例属性

    (1)与修饰符相关的属性,返回布尔值,表示对应的修饰符是否设置。
    RegExp.prototype.ignoreCase:返回一个布尔值,表示是否设置了i修饰符。
    RegExp.prototype.global:返回一个布尔值,表示是否设置了g修饰符。
    RegExp.prototype.multiline:返回一个布尔值,表示是否设置了m修饰符。

    ar r =/abc/igm;
    console.log(r.ignoreCase);
    console.log(r.global);
    console.log(r.multiline);
    

    输出:

    true
    true
    true
    [Finished in 0.3s]
    

    (2)与修饰符无关的属性:

    RegExp.prototype.lastIndex:返回一个整数,表示下一次开始搜索的位置。该属性可读写,但是只在进行连续搜索时有意义,详细介绍请看后文。
    RegExp.prototype.source:返回正则表达式的字符串形式(不包括反斜杠),该属性只读。

    var r= /abc/igm;
    console.log(r.lastIndex);
    console.log(r.source);
    
    

    输出:

    0
    abc
    [Finished in 0.3s]
    

    实例方法:

    (1)RegExp.prototype.test()
    该方法返回一个布尔值,表示当前模式是否能匹配参数字符串。eg:

    var r=/a/g;
    var s='aaaa';
    console.log(r.lastIndex);
    console.log(r.test(s));
    console.log(r.lastIndex);
    console.log(r.test(s));
    console.log(r.lastIndex);
    console.log(r.test(s));
    console.log(r.lastIndex);
    console.log(r.test(s));
    

    输出:

    0
    true
    1
    true
    2
    true
    3
    true
    

    对以上代码进行解释如下:
    注意在lastIndex属性后再进行 test()方法时,会在它所指的索引的后一个开始执行。当然如果两行代码互换之后,就是先检查是否匹配,然后再看索引是多少咯。
    (2)RegExp.prototype.exec()
    正则实例对象的exec()方法,用来返回匹配结果。如果发现匹配,就返回一个数组,成员是匹配成功的子字符串,否则返回null

    var reg=/a/g;
    var str = 'abc_abc_abc';
    while(true){
        var match =reg.exec(str);
        if (!match)break;
        console.log('#'+match.index+':'+match[0]);
    
    }
    

    输出:

    #0:a
    #4:a
    #8:a
    [Finished in 0.2s]
    

    注意以上代码里面这个match[0]好诡异,可能是break的关系,每次退出后都从0开始计数。

    字符串的实例方法

    字符串的实例方法之中,有4种与正则表达式有关。

    String.prototype.match():返回一个数组,成员是所有匹配的子字符串。
    String.prototype.search():按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置
    String.prototype.replace():按照给定的正则表达式进行替换,返回替换后的字符串。
    String.prototype.split():按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员。

    相关文章

      网友评论

          本文标题:JS基础6

          本文链接:https://www.haomeiwen.com/subject/txvitqtx.html