正则表达式入门之顺序环视(lookahead)

在 以前的编码过程中,总是遇到货币数值的问题,比如¥10000000,根据习惯,¥10,000,000更容易阅读,我从前的做法很复杂,要先计算字符串的位数,然后根据位数再决定将第一个逗号放在第一位数字后面还是第二、第三位,后面的数字每个三位加上一个逗号,最后一位不加逗号,设计如此复杂的算法的原因是我没办法,像手动添加逗号一样,自右向左添加每三个数字添加一个逗号,当然也可能是我愚钝,高人会有更好的解决方法。如果您刚好知道一个更好的算法,请告诉,我会感谢您的。

正则表达有个叫lookahead的东西,我也不知道为什么翻译成顺序环视,姑且就这么叫吧,知道是这么回事就行了。顺序环视是自左至右查看文本,尝试匹配子表达式,如果能够匹配,就返回匹配成功信息。顺序环视又分为肯定型顺序环视和逆序环视,解决上面问题,当然是用到逆序环视了。

肯定型顺序环视用的特殊序列是:?=……来表示,省略号表示需要匹配的内容,匹配的顺序是习惯性匹配即自左向右,例如:?=\d,它表示如果位置右边的字符是数字则匹配成功,另一种环视的特殊序列是:?<=……来表示,例如:?<=\d,它表示如果当前位置的左边有一位是数字则匹配成功.

现在来解决本文开始部分提出的数字问题,代码段如下:

/(?<=\d)(?=(\d{3})+\b)/,/g

对代码段解释如下:

(?<=\d)是要限定匹配的位置,保证数字字符串刚好是3的倍数的时候不会出现  ,200,000  这种情况,即逗号的左边是必须有数字的

(?=(\d{3})+\b)是查询每个三个数字的位置,有意思的是段不匹配任何文本,而只是匹配一个位置,所以如果你试图输出每个匹配,那么显示的结果将是NULL

g表示全局替换,跟i表示忽略大小写一样的用法

顺序环视还有其他的内容,我们这里只用到肯定逆序环视和肯定顺序环视,还有否定逆序环视和否定顺序环视,读者可以举一反三,从名称上揣测他们的用法,顺带着找一些资料阅读下便可,这里不再赘述

相关文章


Post a Comment