【MedusaSTears】正则?不要太简单!---正则表达式个人学习心得总结:

吃水不忘挖井人系列:

正则表达式学习笔记

 https://juejin.im/post/582dfcfda22b9d006b726d11

【本文内容如果看不懂,请把上边这个网址学完了再来看】

该文章网上转载很多次,最终找到疑似是原帖的地址.

为什么非要找到原帖?因为里面有大量的图片,很多文章在转载的时候并没有贴上,导致阅读的障碍,

这期间也看了好多帖子,感觉基本上已经通了. 唯独 最后那个将一串数字格式化金额的需求,让我一下子感兴趣起来,并且真正获得知识学习到使用思路上的提升

如何将'123456'转成货币带逗号的。'123,456'。这个是很常规格式化金额的需求。

今天学习了正则,可以一步到位 '123456789'.replace(/(\d)(?=(?:\d{3})+$)/g, '$1,')

 先卖个关子,说点别的

我发现测试正则真的很方便有木有,直接谷歌系列浏览器进入开发者模式F12,

然后找到控制台,打命令就可以了

![UTOOLS1548324699567.png](https://i.loli.net/2019/01/24/5c498f5496084.png)

刚开始接触这个题目,首先想到的是  \d{3}$  这里肯定是定位字符串最后是3个数字的位置

既然是要输入逗号"," 那么肯定是 前瞻  ?=\d{3} 

而且这里需要重点注意:只要用到 前瞻?= 或者 后顾?! 一定要分组,加括号

说白了就是  \d?=\d{3} 

![UTOOLS1548325049217.png](https://i.loli.net/2019/01/24/5c4990b1c3db1.png)

与 \d(?=\d{3}) 是完全不同的概念

![UTOOLS1548325106757.png](https://i.loli.net/2019/01/24/5c4990eaea32e.png)

因为这里涉及到"贪婪匹配" 和 "懒惰匹配"  

他的表达式中的 ?: 用于排除分组记录,实际上没有影响,也就是:

(\d)(?=(\d{3})+$)/g

第一个括号,将 1个 字符的数字 分组 ---暂不说明是什么东西

第二个括号内 ?=(\d{3})+$

    刚才解释过了?=(\d{3}) 是前瞻, 也就是计算机从左到右读取第n位字符的时候,n右侧的都是?= 后顾就是n左侧的?!

    我最开始没有想到,更没有理解 为什么有个加号+ 以及他的意义 ?=(\d{3})+  

     \d(?=(\d{3})$)这个表达式的意思是:  字符串末尾前3位都是数字类型,而此时计算机读取到结尾前第四位数字

    所以将他替换成逗号","就可以将1234变成1,234

但是问题是:也只能替换一次,却不能将 每隔3位都加一个逗号

问题出在哪里?我陷入了深深的思考

然后我总结出了以下心得:

个人心得体会:
1.正则说白了是对字符串的整理,所以对一个无间隙长串,第一步最主要的就是,【分割】字符串,类似于英语的自然拼读法,从业务需求方面,理解并分割字符串
    比如: 邮箱为什么要以@前后分界? 谁告诉你的? 因为你知道这是默认的,然而这恰恰是容易被忽略的重点
2.正确【分割】后,就不难找到关键字符或者关键位置,也就是可能需要replace的地方,这是启动的核心,下手的第一步
3.对于不确定的字符串长度,先找到可以确定的或者唯一的部分
4.如果跟位序有关,则务必用 前瞻 ?= 或者 后顾 ?!
5.注意 ? * + {1,32} 这些量词实际上包括本身
6.注意 . 不包括\n \r 

 比如 var a = 12345678901234567890123

 要变成 12,345,678,901,234,567,890,123

 第一步,绝对不是 12345678901234567890,123

 而是 12 分割 345 分割 678 分割 901 分割 234 分割 567 分割 890 分割 123

然后,才是找到分割点左侧的数字"\d"把他变成"\d,"

这里注意 " / /g " 的意思是全局匹配,就是多次匹配的意思

而这,也就解释了,为什么是      / \d(?=(\d{3}) $)/g

而不是 /   \d(?=(\d{3})$) /g

再解释就是:  (\d{3})+  这个表达式的意思就是 每3个数字一组 至少有一组 

(\d{3})+  $  的意思就是  从结尾开始算起 倒数3个数字一组 再往前倒数4~6这三个数字一组

?=  (\d{3})+$   的意思就是  每组数字前的 那个位置 也就是

"12 分割 345 分割 678 分割 901 分割 234 分割 567 分割 890 分割 123"

这个例子里面 从左到右的 :2 5 8 1 4 7 0 3

 /\d(?=(\d{3})+$)/g  其实就是加了个条件: 每组数字前的那个位置 必须也是数字 如果不是数字不满足这个条件,比如

"1a 34b 678 90c 234 56d 890 123"   里面的a b c d 就不符合这个表达式

而其实符合条件的 只有 0  转换的结果 是  "1a34b67890c23456d890,123"

MedusaSTears

2019年1月24日

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值