美文网首页
正则 非获取匹配

正则 非获取匹配

作者: 方_糖 | 来源:发表于2020-07-14 12:30 被阅读0次

    正则测试链接:https://regex101.com/

    1.有哪些非获取匹配

    参考:https://www.runoob.com/regexp/regexp-metachar.html

    image.png
    2. 什么是非获取匹配,和获取匹配有什么不同

    当我们匹配一个获取匹配的正则表达式,如/123/, 会发现123为选中状态

    image.png

    但是当我们匹配一个包含非获取匹配的正则表达式时,如/(?=\d)/,会发现,以数字结尾的地方都没有被选中,而是用虚线断定了界限位置

    image.png
    3. 几种非获取匹配的使用理解

    (1)(?:pattern)
    组合或字符|使用来匹配多个重复结构的字符串
    如:"5453525150"中匹配54,50

    image.png
    注意:/5(?:4|0)/g写法与/5(4|0)/g/54|50/g写法区别不大,不能专门用作非获取匹配的作用例子

    (2)(?=pattern) 正向肯定预查
    匹配以pattern结尾的字符串
    如: 匹配"windows2000 windows2001"中windows2000中的windows

    image.png

    (3)(?!pattern) 正向否定预查
    匹配不以pattern结尾的字符串
    如: 匹配"windows2000 windows2001"中的windows,但不能匹配windows2000中的windows

    image.png

    (4)(?<=pattern) 反向肯定预查
    匹配以pattern开头的字符串
    如:匹配"2000windows 2001windows"中2000windows中的windows

    image.png

    (5)(?<!pattern) 反向否定预查
    匹配不以pattern开头的字符串
    如:匹配"2000windows 2001windows"中的windows,但不能匹配2000windows中的windows

    image.png
    4.非获取匹配的实际使用距离

    问题一:用正则表达式方法实现numsplit,为任意数字添加千位分隔符。(例如:1234567.1234转换成1,234,567.1234

    解决方法:
    可以把整数部分和小数部分分开处理,小数部分不用处理
    对于整数部分,由于使用普通的split(",")replace(/\d{3}/, ',')只会使得1234567转换成123,456,7,不符合我们的初衷,所以我们要使用(?=pattern) 正向肯定预查,来查找以至少三个数字结尾的分割处

    image.png
    然后通过replace方法替换

    replace使用
    str.replace(reg/str,replacement)中replacement可以为:字符串,$n,函数
    (参考:https://www.w3school.com.cn/jsref/jsref_replace.asp)

    var num="1234567";
    
    var res = num.replace(/\d(?=(\d{3})+$)/g,function(str) {
        return str + ","
    })
    
    

    相关文章

      网友评论

          本文标题:正则 非获取匹配

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