js 正则

作者: McDu | 来源:发表于2020-07-28 15:12 被阅读0次
    1. 删除URL里的参数
    // 移除href里的param
    var removeParam = function(param){
        var reg = new RegExp('(\\?|&)' + param + '=[^&]*(&)?', 'g');
        return location.href.replace(reg, function(p0, p1, p2) {
            return p1 === '?' || p2 ? p1 : '';
        })
    }
    
    1. 匹配一个单词
      \b(元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是 \b 并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。 比如 \bhi\b

    \bhi\b.*\bLucy\b : 匹配 hi .... Lucy 不能换行,.* 匹配任意数量的不包含换行的字符。

    1. \s 匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。
      \w 匹配字母或数字或下划线或汉字等。

    \ba\w*\b 匹配以字母a开头的单词——先是某个单词开始处(\b),然后是字母 a, 然后是任意数量的字母或数字(\w*),最后是单词结束处(\b)

    \b\w{6}\b 匹配刚好6个字符的单词。

    1. 分支条件

    目标:(010)88886666,或022-22334455,或02912345678

    实现:1. \(?0\d{2}[) -]?\d{8} :首先是一个转义字符 \( ,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是 )- 或空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8}). 不幸的是,刚才那个表达式也能匹配010)12345678或(022-87654321这样的“不正确”的格式。

    要解决这个问题,我们需要用到分支条件。正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用 | 把不同的规则分隔开.

    0\d{2}-\d{8}|0\d{3}-\d{7} 这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。

    1. 后向引用
      使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。

      \b(\w+)\b\s+\1\b 匹配重复的单词。eg: go go

    1. 零宽断言
      为什么叫零宽,用于查找某些内容(但不包括这些内容)之前或之后的东西,它们像 \b ^ $ 指定一个位置(零宽),这个位置满足一定的条件(即断言)。

    \b\w+(?=ing\b) 匹配以ing结尾的单词的前面部分(除了ing以外的部分)

    (?<=\bre)\w+\b 匹配以re开头的单词的后半部分(除了re以外的部分)

    (?<=\s)\d+(?=\s) 匹配以空白符间隔的数字(再次强调,不包括这些空白符)

    1. 负向零宽断言
      想要确保某个字符没有出现,但并不想去匹配它

    例如,如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样:

    \b\w*q[^u]\w*\b 匹配包含后面不是字母u的字母q的单词 但是如果多做测试(或者你思维足够敏锐,直接就观察出来了),你会发现,如果q出现在单词的结尾的话,像Iraq,Benq,这个表达式就会出错。这是因为[^u]总要匹配一个字符,所以如果q是单词的最后一个字符的话,后面的 [^u]将会匹配q后面的单词分隔符(可能是空格,或者是句号或其它的什么),后面的\w*\b 将会匹配下一个单词,于是 \b\w*q[^u]\w*\b 就能匹配整个Iraq fighting。负向零宽断言能解决这样的问题,因为它只匹配一个位置,并不消费任何字符。现在,我们可以这样来解决这个问题:\b\w*q(?!u)\w*\b

    (?!exp),断言此位置的后面不能匹配表达式exp
    例如:
    \d{3}(?!\d) 匹配三位数字,而且这三位数字的后面不能是数字;
    \b((?!abc)\w)+\b 匹配不包含连续字符串abc的单词。
    (?<![a-z])\d{7} 匹配前面不是小写字母的七位数字


    https://deerchao.cn/tutorials/regex/regex.htm#negativelookaround

    相关文章

      网友评论

          本文标题:js 正则

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