有以下字符串: 我爱你 我爱 爱 爱你
如果要取出字,要求这个爱字后面有,这个时候就要这么写,这就是 先行断言

  1. '我爱你 我爱 爱 爱你'.match(/爱(?=你)/g) // ["爱", "爱"]

如果要求字后面没有,那自然也有先行否定断言

  1. '我爱你 我爱 爱 爱你'.match(/爱(?!你)/g) // ["爱", "爱"] ,因为匹配相同...

这个时候,如果要求字后面有,前面还要有,那就要用到后行断言了,如下:

  1. '我爱你 我爱 爱 爱你'.match(/(?<=我)爱(?=你)/g) // ["爱"]

最后,如果要求爱字前面没有我,后面也没有我,那就要用到先行否定断言后行否定断言,如下:

  1. '我爱你 我爱 爱 爱你'.match(/(?<!我)爱(?!你)/g) // ["爱"]

先行断言应用: 金额千分位分割

所以正则表达式还是比较灵活的,接下来,让我们一起来瞅瞅正则表达式是如何来玩千分位的,上代码。

  1. function formatMoneyWithReg(number) {
  2. return !(number + '').includes('.')
  3. ? // 就是说1-3位后面一定要匹配3位
  4. (number + '').replace(/\d{1,3}(?=(\d{3})+$)/g, (match) => {
  5. return match + ',';
  6. })
  7. : (number + '').replace(/\d{1,3}(?=(\d{3})+(\.))/g, (match) => {
  8. return match + ',';
  9. });
  10. }
  11. console.log(formatMoneyWithReg(1243250.99));

另一种写法:

  1. export function toThousandFilter(num) {
  2. return (+num || 0).toString().replace(/^-?\d+/g, (m) => m.replace(/(?=(?!\b)(\d{3})+$)/g, ','))
  3. }