祝点赞本文的同学都能完成自己的小目标~~
小目标一个亿,用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})+,这样满足的情况就可以是
- B000.
- B000000.
- B000000000.
- ...
- B000*(n).
这样每三组数字左边的 B 就可以被逗号替换,完成千分位插入。所以最终的答案就是:
'100000000.00'
结尾
我们还可以将 (?!d) 替换成 [^d] 或者 (?=.),或者其他各种元字符来解决千分位问题。
更多有趣的正则玩法等待你去解开神秘的面纱~