美文网首页
JavaScript 正则表达式 handbook

JavaScript 正则表达式 handbook

作者: 吖吓 | 来源:发表于2017-12-19 13:22 被阅读9次

    需要转义的字符

    [ ] / \ $ ^ ( ) ? | . + * { } = ! :
    转义方法:\[ \/

    /\/\[\!/.test('/[!') // ture
    

    直接量

    符号 含义
    \o NUL 字符
    \t 制表符
    \n 换行
    \r 回车
    \xnn 十六进制拉丁字符
    \uxxxx 十六进制Unicode字符

    字符类

    符号 含义
    \w 任何 ASCII字符组成的单词 = [a-zA-Z0-9]
    \W 除 任何 ASCII字符组成的单词 = [a-zA-Z0-9] 外字符
    \s 任何 Unicode 空白符
    \S 除 任何 Unicode 空白符 外字符
    \d 任何 ASCII 数字 = [0-9]
    \D 除 任何 ASCII 数字 = [0-9] 外字符
    . 除换行符和其他 Unicode 终止符以外
    [\b] 退格符
    […] 匹配方括号内任一字符
    [^…] 不匹配方括号内任一字符

    重复

    符号 含义
    {n, m} 匹配 [n, m]次
    {n,} 匹配 [n, *]次
    {n} 匹配 [n, n]次
    ? 匹配 [0, 1] 次
    + 匹配 [1, *] 次
    * 匹配 [0, *] 次

    *以上均为贪婪匹配,非贪婪匹配添加一个 ? 即可,如:??, +?, ?, {n, m}?

    'aaaa'.match(/a+?/) //a
    'aaaa'.match(/a+/) //aaaa
    'aaaab'.match(/a+?b/) //注意:aaaab
    

    选择、分组、引用

    符号 含义 备注
    | 选择,匹配左边字表达式或右边子表达式
    (…) 分组,可修饰 ? + * | 等,记住与该组匹配字符
    (?:…) 只组合,用法同 分组,但不记忆匹配字符
    \n 和第 n 个分组第一次匹配的字符相匹配,组索引为从左到右 ( 的索引,(?…) 不编码 不能在字符类中使用这种引用
    `'a'bbb'b'`.match(/(['"])[^'"]*\1/) 
    //含义:匹配左右引号,\1 匹配第一个括号子表达式匹配的模式
    //结果:[ '\'a\'', '\'', index: 0, input: '\'a\'bbb\'b\'' ]
    

    指定位置匹配

    符号 含义
    ^ 匹配开头
    $ 匹配结尾
    \b 匹配单词边界,即位于 \w和\W 之间,或\w 和字符串开头或结尾之间
    \B 匹配非单词边界
    (?=p) 零宽正向先行断言,接下来都与p匹配,但不能包括 p
    (?!p) 零宽负向先行断言,接下来都不与p 匹配

    不支持后行断言,如:(?<=p) 以 p 为结尾

    /Java(?!Script)([A-Z]\w*)/ //可以匹配 JavaBeans、不匹配 JavaScripter
    /[Jj]ava([Ss]cript)?(?=\:)/ //可以匹配 JavaScript: 不匹配 JavaScriptbbb:
    

    修饰符

    符号 含义
    i 不区分大小写匹配
    g 全局匹配,找到所有匹配
    m 多行匹配,^ 匹配行头,$ 匹配行尾

    String 方法

    /* 不支持全局搜索,自动忽略 g, 参数可以是字符串,自动转换正则式
     -----返回匹配子串起始位置-----
     return 4
    */
    const searchRegx = /script/i;
    'JavaScript'.search(searchRegx);
    
    /* -----返回数组-----
     match[0] 返回完整匹配,match[n] = $n
     return ['1', '2', '3']
    */
    const matchRegx = /\d+/g;
    '1 plus 2 equal 3'.match(matchRegx)
    
    /* -----用于查找和替换-----
     1. 使用函数做参数
     match 匹配子串
     p1,p2... = $1,$2...
     offset 偏移量
     string 原串
    */
    function replacer(match, p1, p2, p3, offset, string) {
      // p1 is nondigits, p2 digits, and p3 non-alphanumerics
      return [p1, p2, p3].join(' - ');
    }
    var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
    // 另: /([^\d]*)(\d*)([^\w]*)/ == /(\D*)(\d*)(\W*)/
    // return abc-123345-#$*%
    
    /* 2. 使用字符串做参数
     $n
     $$ 插入 $
     $& 插入匹配字符串
     $` 插入当前子串左边的内容
     $' 插入当前子串右边的内容
    */
    '"abc"bbb'.replace(/"([^"]*)"/g, '$1new');
    // abcnewbbb
    'bbb"abc"'.replace(/"([^"]*)"/g, '$`');
    // bbbbbb
    'bbb"abc"right'.replace(/"([^"]*)"/g, `$'`);
    // bbbrightright
    'bbb"abc""right"'.replace(/"([^"]*)"/g, `$'`);
    //bbb"right"
    //另:可用于平移字符
    
    '1, 2, 3, 4'.split(/\s*, \s*/); 
    // [1, 2, 3, 4]
    

    RegExp

    // 注意: \\d
    var zipcode = new RegExp("\\d{5}", "g");
    
    // 等价。注意 lastIndex 的最后取值需要手动置为 0。
    zipcode.test("ziprc"); //返回 true
    zipcode.exec("ziprc"); // 返回本次匹配结果
    

    参考

    30分钟了解正则表达式
    精通正则表达式
    JavaScript 高级程序设计

    相关文章

      网友评论

          本文标题:JavaScript 正则表达式 handbook

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