正则 非获取匹配

正则测试链接: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开头的字符串
如:匹配"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 + ","
})

你可能感兴趣的:(正则 非获取匹配)