正则回忆录

正则表达式

某些方法的使用模糊不清,和一些量词及概念的混乱以及使用次数不多使得有的人用起来反而繁琐和易错

  • 需要记住的一些

    1. 如何创建一个正则?

      reg = new RegExp("pattern",'flags')
      
      reg = /pattern/igm
      
    2. 想要搜索多行?不分大小写?匹配多个匹配项?

    i -> 在正则的最后面添加它,就可以不分大小写的匹配元素
    g -> 会匹配多个项
    m -> 多行进行匹配,不写默认央行
    u -> 开启Unicode支持
    y -> 粘滞模式
    
    /hello/igm 不区分大小写,多行,匹配多项
    
    1. 当你不是匹配单个字符时,而是多个字符时需要用到哪些东西呢?比如在hello 1234,my name is kangkang

      {3} 在字符的后面表示3个
      {3,} 大于等于3个
      {3,5} 3个到5个
      

      常用的量词有专门的符号

      * 任意多个(相当于{0,})
      + 不少于1 (大于等于1)
      ? 不大于1 ( 0 到 1)
      
    2. 一些常用的字符被需要查找时使用[a-z][0-9]或者[a-z0-9]常用字符替代符号

    \d [0-9] (digit) 一个数字:0 到 9 的一个字符
    \s [a-z] (space) 一个空格符:包括空格,制表符和换行符
    \w [0-9a-z] (word) 英语字母表中的一个字母或者一个数字或一个下划线
    
    • 以上的字符有特定的反义字符

      \D 非数字:除了 \d 的任何字符,例如一个字母。
      \S 非空格:除了 \s 的任何字符,例如一个字母。
      \W 非“字”字符:除了 \w 的任何东西。
      \B 非边界:\b 的反向检测。
      
    1. 遇到这种情况hello worldwo ,使用 /wo/ 进行匹配时 :
    let str =  'hello  world  wo owowo'
    let value str.match(/wo/g) 
    console.log(value) //Array(4) [ "wo", "wo", "wo", "wo" ]
    

    而你仅仅是想要wo单个单词而不是包含wo的单词,这是你就需要用到边界字符\b

    let str =  'hello  world  wo owowo'
    let value str.match(/\bwo\b/g) 
    console.log(value) //Array [ "wo" ]
    

    这时候获得的就是'hello world wo owowo'里面的wo

    1. 以上每个符号所代表的的都是特定范围内的字符,如果我们在不明确的情况下ne?

    点号 .可以匹配任意换行符意外的字符

    alert( "CS4".match(/CS.4/) )这里.号匹配了CS4最后一个4没有匹配
    
    let reg = /CS.4/;
    
    alert( "CSS4".match(reg) ); // CSS4
    alert( "CS-4".match(reg) ); // CS-4
    alert( "CS 4".match(reg) ); // CS 4(空格也是一个字符)
    
    1. 贪婪模式和懒惰模式

      在一个量词的后面添加一个量词可以启动懒惰模式,默认为贪婪模式,贪婪模式会回溯进行匹配

      let reg = /".+"/g;
      
      let str = 'a "witch" and her "broom" is one';
      
      alert( str.match(reg) ); // "witch" and her "broom"
      

      以上第一个"匹配时在w前匹配到了引号,而.+"会继续进行匹配,.是 匹配任意除换行符的字符,他后面又有量词+大于1个任意多个,所以它会匹配到结尾,而最后一个"并未得到匹配,他将会回溯一直到匹配到"

      上面说到的懒惰模式就是在量词后面紧跟?时会尽可能的少匹配

      let reg = /".+?"/g;
      
      let str = 'a "witch" and her "broom" is one';
      
      alert( str.match(reg) ); // "witch" and her "broom"
      

      上面这段的工作流程就是当.匹配到第一个匹配项时就开始匹配后面的引号了

    2. 对于使用正则每个人的用途不同,RegExp和String均提供了方法,合适的地方使用合适的方法

      1. 筛选出数据位置或者值

        • str.search(reg)

          返回第一个匹配项的位置,如果没有找到就返回-1

        • str.match(reg)

          默认是查找第一个匹配项,返回结果是一个数组,默认情况下会返回额外的属性

          let str = "hello world"
          str.match(/\bwo/)
          // 0: "wo" groups: undefined index: 6 input: "hello world" length: 1     
          
          1. index 匹配项在字符串中的位置

          2. input str原始字符串

            当使用g的时候会匹配所有匹配项,返回的结果中没有额外的属性

            let str = "hello worldwo"
            str.match(/\wo/g) // 0: "wo" 1: "wo" length: 2
            

            如果模式的一部分被括号 (...) 括起来了,未使用全局匹配符g时这部分将会独占数组的一个元素,使用全局匹配符后也不会改变原返回数据

            let str = "hello worldwo"
            str.match(/Wo(rl)/i)
            // 0: 'worl' 1: 'rl' ... 
            
      2. 分隔字符串

        • str.split()
        let str = "hello worldwo"
        str.split(/ /)
        // 0: "hello" 1: "worldwo" length: 2 (Array)
        
      3. 有些人在使用的时候是为了选择到特定的字符进行替换,而String的replace可以很方便实现

        • str.replace(str|reg,str|func)

          返回一个由替换值(replacement)替换一些或所有匹配的模式(pattern)后的新字符串

          模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的回调函数

          let str = 'he,llo wor,ld'.replace(",","")
          "hello wor,ld"
          

          当直接用字符进行替换的时候会发现只进行了一次替换,而使用正则和g可以实现全局替换

          let str  = 'he,llo wor,ld'.replace(/,/g,"")
          "hello world"
          

          第二个参数也就是你想要替换别人的内容可是使用特殊变量名进行替换

变量名 代表的值
$$ 插入一个 "$"。
$& 插入匹配的子串。
`$`` 插入当前匹配的子串左边的内容。
$' 插入当前匹配的子串右边的内容。
$*n* 假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。提示:索引是从1开始
let str = "hello worldwo"
str.replace(/wo/g,"T$&")
// "hello TworldTwo"
let str = "John Smith";

alert(str.replace(/(John) (Smith)/, '$2, $1')) // Smith, John

以上是String常用方法使用,而RegExp也有些方法可以使用

  • ergexp.test(str)

    无论是否找到都会返回truefalse

  • regexp.exec(str)

    不使用g的时候和str.match()相同

    如果有 g,那么 regexp.exec(str) 返回第一个匹配项,然后在 regexp.lastIndex记住 该匹配项结束的的位置。下一次调用从 regexp.lastIndex 开始搜索,并且返回下一个匹配项。如果再没有匹配项了,则 regexp.exec 返回 nullregexp.lastIndex 置为 0

    let str = "A lot about JavaScript at https://javascript.info";
    
    let regexp = /JAVA(SCRIPT)/ig;
    
    // 查找第一个匹配项
    let matchOne = regexp.exec(str);
    alert( matchOne[0] ); // JavaScript
    alert( matchOne[1] ); // script
    alert( matchOne.index ); // 12(匹配项所在的位置)
    alert( matchOne.input ); // 和 str 一样
    
    alert( regexp.lastIndex ); // 22(匹配项结束的位置)
    
    // 查找第二个匹配项
    let matchTwo = regexp.exec(str); // 继续从 regexp.lastIndex 开始搜索
    alert( matchTwo[0] ); // javascript
    alert( matchTwo[1] ); // script
    alert( matchTwo.index ); // 34(匹配项所在的位置)
    alert( matchTwo.input ); // 和 str 一样
    
    alert( regexp.lastIndex ); // 44(匹配项结束的位置)
    
    // 查找第三个匹配项
    let matchThree = regexp.exec(str); // 继续从 regexp.lastIndex 开始搜索
    alert( matchThree ); // null(没有匹配项)
    
    alert( regexp.lastIndex ); // 0(重置)
    

    我们可以强制 regexp.exec 从给定的位置开始搜索,只需要手动设置 lastIndex

    let str = 'A lot about JavaScript at https://javascript.info';
    
    let regexp = /javascript/ig;
    regexp.lastIndex = 30;
    
    alert( regexp.exec(str).index ); // 34,搜索从位置 30 开始
    

posted on 2019-08-06 16:09  2481  阅读(105)  评论(0编辑  收藏  举报

导航