资讯详情

资讯详情

Javascript中正则表达式$1探讨

如何将一串数字格式化为逗号表千分位。找到一种使用正则表达的方法一直不太明白。花了点时间将匹配过程记录下来。由于理解能力较差其中的$1着实烧脑了一阵子。有些结论是我测试的结果可能有些偏差请大家斧正。我们先从例子入手将“1234567890”输出为“1,234,567,890javascript代码letstrTemp1234567890.replace(/(\d)(?(\d{3})$)/g,$1,)大家可以试试看到了吧就是这么简单下面分解一下为什么会得到正确的结果。正则表达式为(\d)(?(\d{3})$)里面使用到了下面的元素描述表达式捕获模式(表达式)正向预查模式(?表达式)匹配 n次{n}匹配 1 次或多次最少 m 次最多 n 次匹配{m,n}字符串结尾$匹配数字\d分解一下(\d{3})$是从结尾重复匹配连续的3个数字在此例中等价于(\d{3}){1,3}$1234567890 输出 1234567890相当于234 567 890这三组数字一起输出如果改成(\d{3}){1,1}$1234567890 输出 1234567890(\d{3}){1,2}$1234567890 输出 1234567890下一步重点来了使用正向预查模式(?表达式)输出表达式”(\d{3})$“之前的部分(?(\d{3})$)1234567890 输出三个空位置用x表示 1x234x567x890现在懞圈了吧为什么输出三个x呢因为”为匹配 1 次或多次而(?表达式)匹配一次就输出一次第一次匹配234567890就输出“x234567890前的x。第二次匹配567890就输出“x567890前的x第三次匹配890就输出“x890前的x没有第四次因为再向前匹配只有一个数字1条件不满足了。好了下面只需将所有x代替为,“就行了。可是x仅仅是几个空位置可视化不强所以再做一点变形加上”(\d)“表示为匹配正向预查结果之前的一个数字分别为147(\d)(?(\d{3})$)1234567890 输出1234567890最后用上面的JS语句将1”“4”“7替换为1,”“4,”“7,”就可输出正确结果。到现在为止没有跟$1扯上任何关系各位不慌下面继续展开。letstrTemp1234567890.replace(/(\d)(?(\d{3})$)/g,$1,)上面的”$1“是个什么鬼呢它表示捕获模式下从左向右最后一个(表达式)的匹配结果此例中”$1“是(\d)这没什么可说的我要说的是下面这个表达式中”$1“表示什么(?(\d{3})$)经过我测试正向预查模式”(?表达式)“的输出不是”$1“所以就是它了(\d{3})$但是问题来了你不是说这个会输出三个分别是”890“”567890“”234567890“到底是哪一个经过测试它只输出第一次匹配也就是”890“结论是在匹配 1 次或多次“表达式中虽然结果只是输出最长的匹配”$1根据匹配方向不同结果也不同(\d{3}) 或 ^(\d{3})1234567890 输出1234567890“$1保留最后一次匹配结果789”(\d{3})$1234567890 输出 1234567890“$1保留最后一次匹配结果890”而(\d{3})就比较奇怪了$1似乎有三个结果”123“”456“”789“目前还未有合理的解释。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →