javascript 正则(将数字转化为三位分隔的样式)
Posted Young_汨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript 正则(将数字转化为三位分隔的样式)相关的知识,希望对你有一定的参考价值。
原文:https://www.cnblogs.com/sivkun/p/7123963.html
\'12345678912345678\'.replace(/\\B(?=(?:\\d{3})+\\b)/g, \',\')
解释:
\\b : 匹配单词边界,就是位于字符\\w([a-zA-Z0-9_])和\\W[^a-zA-Z0-9_]之间的位置,或者位于字符\\w和字符串的开头或者结束之间的位置。
\\B : 匹配非单词边界
var reg = /\\b\\d/g; var str = \'123\'; reg.exec(str);//["1",index:0,input:"123"] reg.exec(str);//null reg = /\\d\\b/g; reg.exec(str);//["3",index:2,input:"123"] reg.exec(str);//null reg = /\\B\\d/g; reg.exec(str);//["2", index: 1, input: "123"] reg.exec(str);//["3", index: 2, input: "123"] reg.exec(str);//null reg = /\\d\\B/g; reg.exec(str);//["1", index: 0, input: "123"] reg.exec(str);//["2", index: 1, input: "123"] reg.exec(str);//null
通过上面代码可以理解\\b和\\B到底是什么玩意了。
`(?:exp)`:正则表达式中小括号具有分组和捕获双重作用,如果在小阔号里面开始加上`?:`则可以使其不被捕获。
`exp1(?=exp2)`:正向前瞻(零宽正向先行断言,零宽的意思是(?=exp2)不占据位置,只是表示一个期望),要匹配的exp1要满足后面是exp2
`exp1(?!exp2)`:负向前瞻(零宽负向先行断言),要匹配的exp1要满足后面是不是exp2
var str = \'你好吗 你好啊 你好呀\'; var reg = /好(?=啊)/g; reg.exec(str);//["好", index: 5, input: "你好吗 你好啊 你好呀"] reg.exec(str);//null reg = /好(?!啊)/; reg.exec(str);//["好", index: 1, input: "你好吗 你好啊 你好呀"] reg.exec(str);//["好", index: 9, input: "你好吗 你好啊 你好呀"] reg.exec(str);//null //说明一下零宽,下面这个正则表示`你`的后面要紧跟着`好`才能匹配,期望后面是`好`! //但是后面紧跟着一个`\\d`,理解的时候把`(?=好)`忽略(因为是零宽,不占据位置), //这就表示在`你`的后面要跟一个数字才能匹配,这就跟上面那个期望相互矛盾, //因此这个正则不会匹配任何字符串。 reg = /你(?=好)\\d/; reg.exec(str);//null reg.test(str);//false reg.test(\'你好\');//false reg.test(\'你好1\');//false reg.test(\'你1好\');//false
再看`/\\B(?=(?:\\d{3})+\\b)/g`什么意思
1. 首先是全局匹配
2. 匹配非单词边界
3. 非单词边界后面有(连续3的整数被个数字加单词边界)
4. 连续的数字不会被捕获
`\'123456789\'.replace(/\\B(?=(?:\\d{3})+\\b)/g, \',\')`
执行过程:
replace函数会进行多次匹配,\\b表示了要匹配到单词边界。
1. 首先从1和2中间开始但是后面有8个数字不满足前瞻性条件
2. 然后到2和3中间,同样不满足
3. 到3和4中间,满足后面有6个数字
4. 把在3和4中间的\\B(非单词边界)替换为","。
5. 依次往下匹配替换
6. 最终返回新的字符串"123,456,789"
正则很强大,比常规的实现方法简洁方便很多。
以上是关于javascript 正则(将数字转化为三位分隔的样式)的主要内容,如果未能解决你的问题,请参考以下文章