js 正则 或_JS正则进阶:数字千分位

ed4d3f4d85ac1530608ccfe0cc16486d.png
祝点赞本文的同学都能完成自己的小目标~~

小目标一个亿,用Number类型表示就是 100000000.00,不过眼睛看花了也数不清几个0,本文目标就是通过正则将其美化为 100,000,000.00

正则表达式

'100000000.00'

这段正则包含了这几个元字符;B、?=、d、{3}+?!。

对于常见的元字符,我们就简单带过:

d:匹配一个数字字符。等价于 [0-9]。
{n}:匹配确定的 n 次, d{3} 可以匹配 '1234' 中的 123。
+:匹配前面的子表达式一次或多次。'zo+' 能匹配 'zo' 以及 'zoo',但不能匹配 'z'。

B:匹配非单词边界

介绍 B 之前,我们先来看下 b 的介绍:

匹配一个单词边界,也就是指单词和空格间的位置

也就是说 b 是匹配一个单词开始结束

'hello'

而 B 是对 b 取反,那么就是匹配一个单词中,每个字符间的地方:

'hello'

现在我们先用 B 来匹配一个亿:

'100000000.00'

可以看到已经成功的将 ‘,’ 插入到了一个亿中每个数字之间了~~

但是插入太多了不能达到我们的要求,别急别急,咱们接着往下面看。

(?=):正向肯定预查

这个用文字解释起来比较抽象,我个人觉得直接上例子来的更快

现在我们要匹配 'ReactDOM' 和 'ReactNative':

const 

上面的例子很简单,相信大家很容易看懂。那么如果现在,我们希望无论是ReactDOM还是ReactNative,匹配中后都只返回 'React',要怎么做呢?

const 

所以可以知道 ?= 的作用就是,正则匹配的时候包含 (?=xxx) 后面的xxx,但是返回匹配成功的结果不含xxx,只包含(?=xxx)前的字符串,这里的前置字符串就是React。

现在我们来将 (?=) 加入到一个亿的正则中去:

'100000000.00'

诶,为什么答案是这样的?并没有每三个数字后面加上逗号。

这是因为我们没有设置结束条件,所以1和0之间的 B 匹配后面有三个数字满足条件,所以1和0之间插入了逗号,后面的也是同理。

不过从 000.00 开始,由于每一个 B 后面都没有连续的三个数字,所以没有插入逗号。

Tip:/B(?=d{3})/,匹配的是 B 和后面三个数字,但是匹配结果只有 B。

(?! ):正向否定预查

(?! ) 和 (?=) 同理,也是在匹配阶段有用,但是不被包含在匹配结果中。

他们的区别就是:(?=XX)是后面XX才匹配成功,(?!XX)是后面没有XX才匹配成功。

const 

结果和 (?=XX) 恰好相反。

继续完善正则表达式,我们在这里设置结束条件为 (?!d):

'100000000.00'

整个正则表达式连起来表达的意思就是:

替换整个字符串的 B,但 B 要满足后面连续三个是数字,第四个不能是数字。

由于 d{3} 只代表了一组连续三个数字,所以只有 100000000.00 这三个0和.满足了,所以我们只需要设置 d{3} 有一个以上就可以匹配所有情况:(d{3})+,这样满足的情况就可以是

  1. B000.
  2. B000000.
  3. B000000000.
  4. ...
  5. B000*(n).

这样每三组数字左边的 B 就可以被逗号替换,完成千分位插入。所以最终的答案就是:

'100000000.00'

结尾

我们还可以将 (?!d) 替换成 [^d] 或者 (?=.),或者其他各种元字符来解决千分位问题。

更多有趣的正则玩法等待你去解开神秘的面纱~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值