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