zoukankan      html  css  js  c++  java
  • javascript正則表達式

    定义一个正則表達式

    能够用字面量

    var regex = /xyz/;
    var regex = /xyz/i;
    

    也能够用构造函数

    var regex = new RegExp('xyz');
    var regex = new RegExp('xyz', "i"); // 第二个參数表示修饰符
    

    正則表達式组成

    直接量字符

    直接量字符如a

    特殊含义的字符须要转义

    假设使用RegExp方法生成正则对象,转义须要使用两个斜杠。由于字符串内部会先转义一次。

    (new RegExp("1+1")).test("1+1") // false
    (new RegExp("1\+1")).test("1+1") // true
    

    字符类

    字符 匹配
    […] 方括号内的随意字符
    [^…] 不在方括号内的随意字符
    - 连字符
    . 除了换行符和行结束符
    w 不论什么ASCII字符组成的单词=[a-zA-Z0-9]
    W =[^a-zA-Z0-9]
    s 空白字符
    S 非空白字符
    d ASCII数字=[0-9]
    D [^0-9]


    连字符-[1-31]表示1至3。而不是到31

    字符类的连字符必须在头尾两个字符中间,才有特殊含义。否则就是字面含义。比方。[-9]就表示匹配连字符和9,而不是匹配0到9。

    反复

    字符 描写叙述
    {n,m}
    {n,}
    {n}
    ? 0次或1次
    + 在于等于1次
    * 在于等于0次

    非贪婪反复

    在上面的反复字符后加上?就是非贪婪反复。

    /a+/匹配字符串aaa时,会匹配aaa。而/a+?/会匹配a

    正則表達式的模式匹配总是会寻找字符串中第一个可能匹配的位置。如/a+b/匹配aaab时,会匹配aaab/a+?

    b/也会匹配’aaab’,都是从aaab中的第一个a開始匹配。所以,非贪婪模式并不表示最短匹配。

    选择、分组和引用

    选择

    |

    匹配abcdef

    /ab|cd|ef/
    

    分组

    ()

    var m = "abcabc".match(/(.)b(.)/);
    m; // ["abc", "a", "c"]
    

    非捕获组

    (?:x)称为非捕获组(Non-capturing group)。表示不返回该组匹配的内容。即匹配的结果中不计入这个括号。

    var m = "abc".match(/(?

    :.)b(.)/); m[1]; // "c"

    引用

    从1開始

    不能在字符类中使用引用

    指定匹配位置

    字符 描写叙述
    ^
    $
     匹配单词边界
    B 匹配非单词边界
    (?=p) x(?=y)称为先行断言(Positive look-ahead),x仅仅有在y前面才匹配。y不会被计入返回结果。
    (?

    !p)

    x(?!y)称为后行断言(Negative look-ahead),x仅仅有不在y前面才匹配。y不会被计入返回结果。


    []匹配的是退格

    关于(?=p)(?!p)

    var m = "abc".match(/b(?

    =c)/); m; // "b" var m = "abd".match(/b(?

    !c)/); m; // ["b"]

    修饰符

    字符 描写叙述
    i 不区分大写和小写
    g 默认情况下,第一次匹配成功后。正则对象就停止向下匹配了。g修饰符表示全局匹配(global),加上它以后,正则对象将匹配全部符合条件的结果,主要用于搜索和替换。
    m 字符串的头部或尾部可能会有换行符。

    默认情况下,正则对象会将换行符算入字符串的开头或结尾。

    m修饰符表示多行模式(multiline),加上它以后。正则对象会忽略字符串头部或尾部的换行符,即^和$会忽略换行符。


    关于m

    /world$/.test("hello world
    ") // false
    /world$/m.test("hello world
    ") // true
    

    上面的代码中。字符串结尾处有一个换行符。假设不加m修饰符,匹配不成功,由于字符串的结尾不是world;加上以后,换行符被省略,匹配成功。


    属性和方法

    ignoreCase:返回一个布尔值,表示是否设置了i修饰符,该属性仅仅读。

    global:返回一个布尔值。表示是否设置了g修饰符,该属性仅仅读。

    multiline:返回一个布尔值。表示是否设置了m修饰符,该属性仅仅读。

    var r = /abc/igm;
    
    r.ignoreCase // true
    r.global // true
    r.multiline // true
    

    lastIndex:返回下一次開始搜索的位置。该属性可读写。可是仅仅在设置了g修饰符时有意义。

    source:返回正則表達式的字符串形式(不包括反斜杠),该属性仅仅读。

    var r = /abc/igm;
    
    r.lastIndex // 0
    r.source // "abc"
    

    test()

    正则对象的test方法返回一个布尔值。表示当前模式能否匹配參数字符串。

    /cat/.test('cats and dogs') // true
    

    假设正則表達式带有g修饰符,则每一次test方法都从上一次结束的位置開始向后匹配。

    r.lastIndex // 0
    r.test(s) // true
    
    r.lastIndex // 2
    r.test(s) // true
    
    r.lastIndex // 4
    r.test(s) // false
    

    带有g修饰符时,能够通过正则对象的lastIndex属性指定開始搜索的位置

    var r = /x/g;
    var s = '_x_x';
    
    r.lastIndex = 4;
    r.test(s) // false
    

    exec()

    正则对象的exec方法,能够返回匹配结果。假设发现匹配。就返回一个数组,每一个匹配成功的子字符串,就是数组成员,否则返回null。

    var s = '_x_x';
    var r1 = /x/;
    var r2 = /y/;
    
    r1.exec(s) // ["x"]
    r2.exec(s) // null
    

    假设正则表示式包括圆括号(即要求“组匹配”),则返回的数组会包括多个元素。

    当中,第一个元素是整个匹配成功的结果,后面的元素就是圆括号相应的匹配成功的组。

    也就是说。第二个元素相应第一个括号,第三个元素相应第二个括号,以此类推。

    exec方法的返回数组还包括下面两个属性:
    input:整个原字符串。
    index:整个模式匹配成功的開始位置(从0開始)。

    var r = /a(b+)a/;
    var arr = regex.exec("_abbba_aba_");
    
    arr // ["abbba", "bbb"]
    
    arr.index // 1
    arr.input // "_abbba_aba_"
    

    假设正則表達式加上g修饰符,则能够使用多次exec方法,下一次搜索的位置从上一次匹配成功结束的位置開始。

    var r = /a(b+)a/g;
    
    var a1 = r.exec("_abbba_aba_");
    a1 // ["abbba", "bbb"]
    a1.index // 1
    r.lastIndex // 6
    
    var a2 = r.exec("_abbba_aba_");
    a2 // ["aba", "b"]
    a2.index // 7
    r.lastIndex // 10
    
    var a3 = r.exec("_abbba_aba_");
    a3 // null
    a3.index // TypeError: Cannot read property 'index' of null
    r.lastIndex // 0
    
    var a4 = r.exec("_abbba_aba_");
    a4 // ["abbba", "bbb"]
    a4.index // 1
    r.lastIndex // 6
    

    字符串中与正則表達式相关的4个函数

    match

    match方法与正则对象的exec方法很相似:匹配成功返回一个数组,匹配失败返回null。

    假设正則表達式带有g修饰符,则该方法与正则对象的exec方法行为不同。会一次性返回全部匹配成功的结果。

    var s = "abba";
    var r = /a/g;
    
    s.match(r) // ["a", "a"]
    r.exec(s) // ["a"]
    

    设置正則表達式的lastIndex属性,对match方法无效。匹配总是从字符串的第一个字符開始。

    字符串对象的search方法。返回第一个满足条件的匹配结果在整个字符串中的位置。假设没有不论什么匹配,则返回-1。

    该方法会忽略g修饰符。

    设置正則表達式的lastIndex属性,对match方法无效,匹配总是从字符串的第一个字符開始。

    replace

    它接受两个參数,第一个是搜索模式,第二个是替换的内容。

    搜索模式假设不加g修饰符。就替换第一个匹配成功的值。否则替换全部匹配成功的值。

    replace方法的第二个參数能够使用美元符号$,用来指代所替换的内容。

    $ & 指代匹配的子字符串。

    $` 指代匹配结果前面的文本。

    $’ 指代匹配结果后面的文本。

    $n 指代匹配成功的第n组内容。n是从1的自然数。

    "hello world".replace(/(w+)s(w+)/,"$2 $1")
    // "world hello"
    
    "abc".replace("b", "[$`-$&-$']")
    // "a[a-b-c]c"
    

    replace方法的第二个參数还能够是一个函数,将匹配内容替换为函数返回值。

    作为replace方法第二个參数的替换函数,能够接受多个參数。它的第一个參数是捕捉到的内容,第二个參数是捕捉到的组匹配(有多少个组匹配,就有多少个相应的參数)。

    此外。最后还能够加入两个參数,倒数第二个參数是捕捉到的内容在整个字符串中的位置(比方从第五个位置開始)。最后一个參数是原字符串。

    split

    字符串对象的split方法依照正则规则切割字符串,返回一个由切割后的各个部分组成的数组。

    该方法接受两个參数。第一个參数是分隔规则。第二个參数是返回数组的最大成员数。

    'a,  b,c, d'.split(',')
    // [ 'a', '  b', 'c', ' d' ]
    
    'a,  b,c, d'.split(/, */)
    // [ 'a', 'b', 'c', 'd' ]
    
    'a,  b,c, d'.split(/, */, 2)
    [ 'a', 'b' ]
    

    空格能够直接用/, */


  • 相关阅读:
    python mysql and ORM
    mysql-8.0.12-winx64 解压版安装(转)
    mysql装完计算机管理里面没mysql服务怎么解决(转)
    Python使用MySQL数据库(新)(转)
    Python之路,Day9
    python随笔2(列表的增删改查)
    python随笔1
    2018-05-23——PYTHON第三天
    2018-05-22——PYTHON第二天
    2018-05-21——python第一天
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7117263.html
Copyright © 2011-2022 走看看