javascript - 求大神帮我解释下这个正则表达式的意思
迷茫
迷茫 2017-04-10 17:05:07
[JavaScript讨论组]
  1. 看不懂!

String.prototype.getAns = function() {

var pattern = /(?=((?!\b)\d{3})+$)/g;
return this.replace(pattern, ',');
}
 
var s = '1234567894154131';
console.log(s.getAns());  // 123,456,789
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(2)
黄舟
var pattern = /(?=((?!\b)\d{3})+$)/g;

?=?!都是正向环视,也叫正向零宽度断言。零宽度的意思是它们并不会匹配实际的字符,而是只会匹配位置。这和^,$等是一样的。

为了简单,我们先省掉(?!\b)这部分,于是上面的正则变成了:

/(?=\d{3})+$)/g

它会从字符串的开头进行检查,看看字符串是不是能够匹配若干个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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号