Js正则表达式——匹配⼀个空位置
以前说到正则表达式,我以为就是匹配⼀些字符,然后拿到匹配的元素⼀顿操作,或者使⽤类似place这种⽅法对匹配到的元素进⾏替换。但是最近发现,它也能匹配空字符,并做⼀些事情。
考虑这个问题:我要把123456789这个数字从个位数起每隔三位加⼀个,——即把它变成123,456,789这种格式,要怎么做?这是⼀个很实⽤的问题,与钱相关的东西或多或少都会被要求处理格式。
我们可以⽤Javascrpt来处理,实现它的⽅式有很多,⽐如这样:
function formatCash (num) {
num += '';
if (/^(-?)(\d+)(\.\d+)?$/.test(num)) {
let absFloorCash = RegExp.$2;
let digit;
let tcash = absFloorCash.split('').map((item,index) => {
if ((digit = absFloorCash.length - index - 1)
js正则表达式判断数字&& index !== 0
&& (digit % 3 === 0)) {
return item + ',';
} else {
return item;
}
}).join('');
return RegExp.$1 + tcash + RegExp.$3;
} else {
throw "输⼊的现⾦格式不对:" + num;
}
}
console.log(formatCash(-32123998556.12562)); // -32,123,998,556.12562
console.log(formatCash(236522623)); // 236,522,623
console.log(formatCash(0.236562)); // 0.236562
console.log(formatCash(15262622.36522)); // 15,262,622.36522
其实Number对象有⼀个叫做toLocaleString的⽅法,也可以直接帮我们搞定:
(123890999.123).toLocaleString(); // "123,890,999.123"
那⽤正则怎么写呢?
function formatCashByReg (num) {
num += '';
place(/(?<=^-?\d+)(?=(\d{3})+(\.|$))/g, ',');
}
console.log(formatCashByReg(-32123998556.12562)); // -32,123,998,556.12562
console.log(formatCashByReg(236522623)); // 236,522,623
console.log(formatCashByReg(0.236562)); // 0.236562
console.log(formatCashByReg(15262622.36522)); // 15,262,622.36522
实现起来⾮常简洁,⽤到的是ES6提供的正则环视(lookahead / lookbehind)功能:
规则功能
x(?=y)x后⾯紧跟y时才匹配
x(?!y)x后⾯没紧跟y才匹配
(?<=y)x x前⾯紧跟y时才匹配
(?<!y)x x前⾯没紧跟y时才匹配
来看看我们的正则,其实它是由两个环视构成的,⼀个是后环视(?<=^-?\d+),另外⼀个是前环视(?=(\d{3})+(\.|$))。先来看第⼀个,去掉环视后就是^-?\d+,表明从字符串开头到我们的⽬标位置,可以在开头有⼀个或零个-,然后紧跟的是⼀串数字(注意不能有⼩数点.)。再来看第⼆个,去掉环视后是(\d{3})+(\.|$),表明从⽬标位置开始,后⾯依次紧跟的是n个三位数的组合,然后紧跟⼩数点或者字符串末尾。
这个正则的含义⾜够直接,但是注意它没有匹配到任何字符,⽽只是匹配了⼀个“位置”,这个“位置”的后⽅满⾜后环视的正则,前⽅满⾜前环视的正则,在replace操作时只是将这个位置匹配到的空字符""替换为了","。
初次见到这个我是⽐较懵逼的,竟然还能匹配空字符?正则还真是⼀个神奇的东西,⽤得灵活的话可以简化很多操作。这只是个简单的例⼦,但是提供了⼀种解决类似问题的思路。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。