看不懂!
String.prototype.getAns = function() {
var pattern = /(?=((?!\b)\d{3})+$)/g;
return this.replace(pattern, ',');
}
var s = '1234567894154131';
console.log(s.getAns()); // 123,456,789
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
?=和?!都是正向环视,也叫正向零宽度断言。零宽度的意思是它们并不会匹配实际的字符,而是只会匹配位置。这和^,$等是一样的。为了简单,我们先省掉
(?!\b)这部分,于是上面的正则变成了:它会从字符串的开头进行检查,看看字符串是不是能够匹配若干个
3个数字一组的子串。如果能匹配就返回当前位置,否则从第二个字符开始继续检查。例如对于
1234567这个字符串,首先会从开头位置进行匹配。注意开头位置位于1的前面,即_1234567下划线所在的位置(零宽度断言永远只会匹配位置,而不是字符)。但该位置是无法匹配的,因为后面有7个数字,不能划分为若干个3数字一组的子串。于是正则向前进一步,跳过第一个字符,开始匹配
1_234567下划线所在的位置。而这明显是可以匹配的,此时后面的6个数字可以划分为2组:1(234)(567),于是这个位置匹配成功,因此被替换为逗号,变成1,234567。由于有
g这个修饰符,所以匹配没有停止,会一直进行到字符串末尾。但接下来的2和3两个位置都无法匹配,原因同上,但4这个位置又能匹配了,即:1,234_567,于是该位置被替换为逗号,变成1,234,567。接下来匹配仍然会继续,但后面的所有位置都已经无法匹配了,所以这一步就是最终的结果。下面再来看看
(?!\b),\b意思是单词分界符(空格、标点符号、换行符等),前面加上?!的意思是检查当前位置的前方(右侧)是否没有单词分界符。由于前面的表达式已经要求右侧全部是数字了,所以肯定不可能再有单词分界符,因此我觉得这个是多余的,简单测试了一下,确实加不加都一样。(也许还有我没想到的情况?欢迎讨论)这个是零宽断言,不会捕获到任何字符串,但是依然会返回匹配的index