正则表达式-温故而知新

正则表达式

重新整理进修,为了加深印象,发现了之前脱漏的一个非常主要的知识点优先选择最左端的婚配效果,这个划定规矩

js上建立正则的体式格局

  • 直接字面量的建立

    const r = /xx/;    //经由过程双斜杠,在中心增加婚配的划定规矩,如许就是一个正则表达式了
  • 经由过程组织函数建立

    const r = new RegExp('xx', g)  //经由过程组织函数来建立正则对象,第一个参数为婚配划定规矩字符串,第二个参数能够增加修饰符,比方g,i,m,y

正则的实例要领

  • 经常运用的exec,能够返回一个类数组,信息比较全

    const r = /a/g
    r.exec('asd')   //返回["a", index: 0, input: "asd", groups: undefined]0: "a"groups: undefinedindex: 0input: "asd"length: 1__proto__: Array(0)

    能够看看返回的信息有些什么?

    • 一个元素代表:团体婚配返回的效果,假如正则中有子组婚配,那末会在index元素前返回,比方

      /(a)s/g.exec('afasg')  // 返回 ["as", "a", index: 2, input: "afasg", groups: undefined]
    • index就是婚配的索引位置信息
    • input就是目的字符串是什么,
    • groups这边返回undefined,由于正则中没用到;它是返回自定义名字的子婚配信息,比方

      /(?<groupone>a)s/g.exec('afasg')
      //返回  ["as", "a", index: 2, input: "afasg", groups: {groupone: "a"}]
  • 不经常运用的要领test,返回Boolean值,示意是不是有婚配的字符串

正则的主要划定规矩

比较全的划定规矩,在这

我讲讲几个比较主要的,经常运用的

  • 修饰符:i,m,g,y,修饰符之间能够同时运用
    i就是疏忽大小写,比方验证码上的运用 => /a/i.test('A') //true
    m就是能辨认换行,也就是能推断出行末

    /a$/.test('a\nb')  //false 
    /a$/m.test('a\nb')  //true

    g是能举行一连的婚配,当婚配胜利一次后还能继承婚配直到没有为止,而且能够经由过程lastIndex能够检察下一次婚配的最先的索引然则只对同一个正则有用,能一连指定,不然都是从零最先,这里的同一个是指内存地址相称,不是内容相称就够了

    const r = /a/g      //这里经由过程变量r定义如许用r举行背面的操纵都会是用一个
    r.lastIndex         //0
    r.test('asdasd')    //true
    r.lastIndex         //1

    y平常和g连用,y的作用是必需从一最先就婚配上,不然就false;相当于加了个^

    /a/y.test('ba')  //false
    /a/y.test('ab')  //true ,平常和g连用,举行一连头部婚配是不是胜利
  • \b,\B用于婚配是不是是词的边境,不存在/wbw/它的意义就是是不是存在一个是词的边,但前面又有一个w,显著是不存在的(w等价于[A-Za-z0-9_])

    /\ba/g.test('ad') //true 
    /\ba/g.test('bad') //false
    /\ba/g.test('c-ad') //true  
    \B就是取反不是词的边境
  • [],()之间的区分,这两个分红经常运用
    []仅仅代表一个字符串,不论内里写若干计划,终究照样会去婚配一个字符串
    经常运用的有

    [xyz]   //代表婚配x或许y或许z
    [^]     //等价于[^''],恣意字符串
    [\S\s]  //恣意字符串   ,\s是婚配空格,换行(一些带有空格的u码,细致能够看链接) \S就是婚配除了\s不测的字符串

    ()是用于取子婚配的值,又叫元组;有时候我们团体婚配上了,但又想在内里取某个值就能够加上个括号,效果中就会帮你返回,在将exec时以及提到了,这边不举例了
    能够和字符串的replace要领一同运用,举行负庞杂的操纵

    const r = /he(b)/g
    'afdhjbkhbgd'.replace(r, (match, $1) => {
        //match 是团体婚配的效果,$1是第一个元组返回值,当多个元组存在时是有外到里的
        return xxxx
    })
  • .代表一个字符,除了空格,相似换行;另有一些大于大于0xFFFF的字符,他会以为这是两个字符,所以用于简朴的恣意字符串婚配,可用.代表
  • 量词
    a{n}能够用来代表去婚配n个a,还能够写区间{1,3}婚配1到3个
    +,*,?这些事贪欲婚配的量词,就是数目往大了取,不牢固,但又局限+ //[1, Infinity] * //[0, Infinity] ? //[0, 1]

    假如在其背面再增加个?就黑白贪欲婚配了,取值就只管往小了取
    非贪欲婚配的作用在哪,能够经由过程一个简朴的例子看一下

    //假如要婚配字符换'caabaaab' ,假如只想取aab就会用到非贪欲婚配 经由过程/a+?b/g来婚配;用?来指定非贪欲婚配,加上b的限定,不会取到1;这边用+照样*是一样的
  • 壮大的断言
    能够明白成你是用于婚配的划定规矩但不是我想要输出的内容

    • 非捕捉组
      ?:示意;说直白点就是:照样这么婚配然则我不返回括号里的内容,所以我们举行split的组婚配时能够举行修正console.log("abc".split(/(?:b)/)); //["a", "c"]
    • 先行断言
      x(?=y)示意,意义是婚配一个x,x必需在y前面,效果中不返回y
    • 先行否认断言
      x(?!y)示意,意义是婚配一个x,x背面不能是y,效果中不返回y
    • 后行断言
      (?<=y)x示意,意义是婚配一个x,x前面必需是y,效果中不返回y
    • 后行否认断言
      (?<!=y)x示意,意义是婚配一个x,x前面不能是y,效果中不返回y

      console.log(/(?<!=b)a/.exec("bcaba"));  //["a", index: 2, input: "bcaba", groups: undefined]
      console.log(/(?<=b)a/.exec("bcaba"));   //["a", index: 4, input: "bcaba", groups: undefined]

最主要最优先的划定规矩

  • 优先选择最左端的婚配效果
    能够经由过程几个例子自证一下

    /a+?b/.exec('baaabab')    
    //效果["aaab", index: 1, input: "baaabab", groups: undefined],由于先婚配上了aaab,所以疏忽非贪欲准绳不输出ab或许b
    
    /a*?/.exec('baaa')
    //返回["", index: 0, input: "baaa", groups: undefined]  由于先婚配上了空串所以效果为空串

罕见的正则例子

  • 去除首尾空格 ' fds df '.replace(/^\s*|\s*$/g, '')
  • 去除首尾空格 ' fds df '.replace(/\s*(?=\S*)/g, '')
  • 千分位数字格式化 '1234567890'.replace(/\B(?=((\d{3})+$))/g, '.');
    假如有小数, ('1234567890.123').replace(/\B(?=((\d{3})+\.))/g, ',')
    兼并二者: ('1234567890.213').replace(/\B(?=((\d{3})+(\.\d+)?$))/g, ',')

`

    原文作者:Infinity
    原文地址: https://segmentfault.com/a/1190000018038443
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞