• 再读js正则表达式


    正则表达式定义

    在js中有两种方式来定义正则表达式,

    第一种是类似perl的语法来定义一个正则表达式,我们把它叫做正则表达式字面量法:

    	var expression = /pattern/flag
    

    其中pattern就是一个正则表达式,由字符类、限定符、分组、向前查找和反向引用组成。flag是匹配模式的标志,有gim三种:g代表全局模式,i代表不区分大小写,m表示多行模式。

    第二种就是用RegExp构造函数创建,把它称作构造函数法。

    如果第一种方法是这样表达:

    	var pattern = /[bc]at/i;
    

    换做构造函数法就如下:

    	var pattern = new RegExp("[bc]at", "i");
    

    两种方式是等价的,但是用构造函数法的时候元字符都要使用双重转义,比较麻烦,因此还是推荐使用字面量法,也不会混乱。

    两种方法虽然是等价但是还有区别的,使用字面量法定义的正则表达式始终会共享同一个RegExp实例,而构造函数法的正则表达式每次都会创建一个新的实例,因此在循环调用正则表达式的方法时候两者会有不同的结果的,注意下就可以了。

    字符类

    也就是指书写pattern时候的各种形式的字符,除了'abc'这样的简单字符类主要有:

    字母字符类

    [...]

    [^...]

    .

    w

    W

    d

    D

    s

    S

    []

    非字母字符类

    v

    f

    xnn

    uxxxx

    cX

    转义字符类

    也就是元字符,需要加上""进行转义

    ()

    {}

    []

    ^

    $

    |

    ?

    描述类

    重复

    {m,n}

    {m,}

    {m}

    ?

    x? —在描述符后跟一个?表示非贪婪匹配,因为默认的都是贪婪匹配。

    选择

    |

    分组和引用

    (x) — 匹配 'x' 并且记住匹配项以便引用,引用用 。

    (?:x) — 匹配 'x' 但是不记住匹配项

    锚类

    ^

    $

    

    B

    (?=p) —正序断言

    (?!p) —否定断言

    RegExp实例方法

    exec()

    此方法可以说是为了捕获组而设置,接受一个字符串参数,返回包含第一个匹配项信息的数组,注意这里仅仅是第一个匹配项,即使加上g标志也是返回一个匹配项,不过加上g后连续调用exec()是在字符串中继续往下进行查找新匹配,但仍然是一个匹配项。

    此方法返回的数组除了包含第一个匹配项外,其他则是与捕获组匹配的字符串。这个数组也有两个额外的属性index和input,index表示匹配项在字符串中的位置,而input则表示应用正则表达式的字符串。

    test()

    此方法接受一个字符串参数,如果模式与字符串匹配返回true,不匹配则返回false。通常用来做判断。

    字符串的模式匹配方法

    相对于RegExp实例方法来说这个反过来了,执行的是字符串的方法,参数是正则表达式。

    查找匹配的字符串,返回第一个子串的起始位置,不支持全局匹配。

    match

    返回由匹配结果组成的数组,默认非全局匹配的话返回第一个匹配的字符串,如果全局匹配则返回所有匹配字符串。当使用括号分组的时候第一个元素为匹配的字符串,其后为圆括号中各个匹配的子字符串。

    match方法与RegExp的exec方法很相似的,只是exec方法在全局匹配模式下还是返回第一个匹配字符串。

    replace

    一个在字符串中执行查找匹配的方法,并且使用替换字符串替换掉匹配到的子字符串。可以用$n来匹配正则表达式中圆括号中子表达式的捕获组文本。

    与分组与引用里的括号一个意思:
    那里是在正则表达式中用 来引用捕获组匹配项。

    split

    字符串分割为数组。

    几个有趣的正则表达式

    1.把一串连续的数字变为三位分割表达的形式,比如12345变为12,345

    答案:

    "12345".replace(/(d)(?=(?:d{3})+(?!d))/g, "$1,")
    

    用到了正序断言,否定断言和非捕获分组三个重要的字符。

    2.有美元1,100.0$和1,100.0¥这两种货币,用一句正则表达式把美元换成人民币,把人民币转换成美元。

    答案:

    	 '1,111.222¥'.replace(/(d(?:,(?=ddd)|d)*(?:.d+)?)([$¥])/g,function(m,s1,s2){
    	 	if(s2=="$") {
    	   		return s1+"¥"
    	   } else {
    	   		return s1+"$"
    	   }
    	  })
    

    replace后跟函数时候,第一个参数为匹配的文本,后面参数依次为捕获组。

    参考资料

    权威指南正则

    正则匹配和回溯

  • 相关阅读:
    使用 VSCode 编写 .NET Core 项目之初体验
    Apache自带 ab压测工具 Windows配置使用说明
    HTTP 错误 401.3
    Knockout学习,添加模板,事件,Mouseover,mouseout
    QQ空间、新浪微博、腾讯微博等一键分享API链接代码
    Session["Write"] = "Write";
    那一年,不堪回首的毕业设计
    iis 发布asp.net mvc 网站时候js css 压缩问题,图片不加载问题
    nopcommerce
    HttpWebRequest抓取网页内容与直接输入URL得到的内容不一致!球大神帮忙!!
  • 原文地址:https://www.cnblogs.com/lijie33402/p/6485090.html
Copyright © 2020-2023  润新知