正则 非获取匹配
正则测试链接:https://regex101.com/
1.有哪些非获取匹配
参考:https://www.runoob.com/regexp/regexp-metachar.html
![](https://img.haomeiwen.com/i14415740/944dcc9596c1d852.png)
2. 什么是非获取匹配,和获取匹配有什么不同
当我们匹配一个获取匹配的正则表达式,如/123/
, 会发现123为选中状态
![](https://img.haomeiwen.com/i14415740/27e2990a8eecfbe5.png)
但是当我们匹配一个包含非获取匹配的正则表达式时,如/(?=\d)/
,会发现,以数字结尾的地方都没有被选中,而是用虚线断定了界限位置
![](https://img.haomeiwen.com/i14415740/860acd6581c04682.png)
3. 几种非获取匹配的使用理解
(1)(?:pattern)
组合或字符|
使用来匹配多个重复结构的字符串
如:"5453525150"
中匹配54,50
![](https://img.haomeiwen.com/i14415740/4c28d084c8c905be.png)
注意:
/5(?:4|0)/g
写法与/5(4|0)/g
,/54|50/g
写法区别不大,不能专门用作非获取匹配的作用例子
(2)(?=pattern)
正向肯定预查
匹配以pattern结尾的字符串
如: 匹配"windows2000 windows2001"
中windows2000中的windows
![](https://img.haomeiwen.com/i14415740/f4df39b7b7f010ba.png)
(3)(?!pattern)
正向否定预查
匹配不以pattern结尾的字符串
如: 匹配"windows2000 windows2001"
中的windows,但不能匹配windows2000中的windows
![](https://img.haomeiwen.com/i14415740/e1833b33ea27c78c.png)
(4)(?<=pattern)
反向肯定预查
匹配以pattern开头的字符串
如:匹配"2000windows 2001windows"
中2000windows中的windows
![](https://img.haomeiwen.com/i14415740/738004da7db5f588.png)
(5)(?<!pattern)
反向否定预查
匹配不以pattern开头的字符串
如:匹配"2000windows 2001windows"
中的windows,但不能匹配2000windows中的windows
![](https://img.haomeiwen.com/i14415740/64a8293665aabd58.png)
4.非获取匹配的实际使用距离
问题一:用正则表达式方法实现numsplit,为任意数字添加千位分隔符。(例如:1234567.1234
转换成1,234,567.1234
)
解决方法:
可以把整数部分和小数部分分开处理,小数部分不用处理
对于整数部分,由于使用普通的split(",")
和replace(/\d{3}/, ',')
只会使得1234567
转换成123,456,7
,不符合我们的初衷,所以我们要使用(?=pattern)
正向肯定预查,来查找以至少三个数字结尾的分割处
![](https://img.haomeiwen.com/i14415740/7e3c409686bff965.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 + ","
})