正则表达式

使用

正则表达式是一个很有用的工具,能够方便地验证字符串,匹配一定规则的字符。

举个例子:验证用户输入的是移动手机号。移动有很多号段,手机号是11位的数字。如果用代码写这个验证,有点琐碎。此时就很适合用正则表达式。

/^(13(4|5|6|7|8|9)|147|15(0|1|2|7|8|9)|178|18(2|3|4|7|8)|198)\d{8}$/

克制

并不是所有的字符串验证规则都能写成正则表达式。正则表达式比较适合线性的确定的规则,并不适合复杂的、条件的、分支的规则。而且规则越复杂,正则即便写得出来,也很难看清楚。

举个例子:验证用户输入的字符串,如果有连字符(-),它不在起始位置,也不在结束位置,且不允许连字符相连。

我尝试过用正则表达式来写,但是没有成功,最后用代码写了验证函数。如果你写不出规则的正则表达式,很可能是正则真的做不到,并不是你正则学得不精。

保持克制、喝杯茶,换个思路,会有不一样的结果。

lookbehind assertion支持

如果在前端使用正则表达式,还需要注意各浏览器对正则表达式的支持程度,一些浏览器比如Safari目前是不支持向后断言的。具体参照此处

()、(?:)和x(?=y)的区别

写一个正则,要求能够测出字符串是否以@r.com或@f.com结尾。以下有4种写法

  1. /@(r\.com|f\.com)$/.test('@r.com');
    true
  2. /@(?:r\.com|f\.com)$/.test('@r.com');
    true
  3. /@(?=r\.com|f\.com)/.test('@r.com1');
    true
  4. /@(?=r\.com|f\.com)$/.test('@r.com');
    false

其中写法3和4都是错的。写法3没有考虑到必须以特定字符结尾。写法4初看感觉好对的样子,但x(?=y)只会匹配x,并不会匹配y,regex.test(str)仅当字符串和正则有匹配时才返回true,由于$的加入,相较于写法3,写法4反而永远不会有匹配。

写法1和2只是组捕获和不捕获的区别。