正则表达式

基本的元字符之类的百度谷歌各种正则书都有介绍,就不再重复啦。另外RegExr的cheatsheet也有简要介绍。

要介绍的是对两个正则的理解。

1.密码(要求至少8个字符,至少一个数字,至少有一个小写字母和一个大写字母,至少包含一个比如@#%$^的字符,不能包含空白)

答案是/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#%$^])(?=\S+$).{8,}$/gm

(?=abc),正向先行断言。自我吐槽一句,“断言”这个词汇硬是理解了半天。不就是“判断的句子”的意思么?所以正向断言就是判断字符串是否满足条件, 但又不消耗字符串的字符。有点像if(abc){}

因此(?=.*[0-9])就是满足“除换行符以外的其他字符任意个+任意一个数字”这样一个条件。后面4个先行断言也是如此。因此整个正则的意思就是满足这5个 条件的8个以上的任意字符。

2.千分符

在一篇介绍正则的文章中看到的这个例子。有意思的是,当初我看不懂那道正则,然后Google了一下相关问题,结果找到了另外一种解法。等我理解完这种解法 后,我才发现Google到的那个正则要比那篇文章中的正则要难理解得多。

    function putComma(price){
      return price.toString().replace(/\B(?=(?:\d{3})+(?!\d))/g, ",");
      }

(?!abc),负向先行断言。相当于if(!abc){}。所以(?=(?:\d{3})+(?!\d))的意思就是数字的数目要成3的倍数,后面不可有额外的数字。

用一张图来解释就是这样的:

regexp
上述正则的图解