正则表达式
基本的元字符之类的百度谷歌各种正则书都有介绍,就不再重复啦。另外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的倍数,后面不可有额外的数字。
用一张图来解释就是这样的:
