背景
之前用JS做了一个输入校验的功能,要求输入的必须是一个合法的email地址,结果在自己测试的时候发现输入不通过。检查发现,现在手机输入法(搜狗)联想输入的时候,默认会在输入的词语后面加上一个空格,所以导致校验的正则不通过。
思路
Email校验的正则如下:
1 | let reg = new RegExp("^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$") |
根据上述正则,是不允许字符串开头结尾有空格之类的多余字符的。那么解决这个问题就有两个方案:
- 修改正则,允许开头、结尾有空格等符号
- 对输入做处理,删除开头、结尾的空格等符号
这里我选了第二种,因为一直有在写python
,其中有一个strip()
函数,可以自动的删除字符串开头结尾的空格等多余符号的,所以理所当然认为javascript
也有,结果发现竟然是没有的。
那么需要自己写一个了。
对字符串的处理,最简单粗暴的也就是正则了。
在正则中
\s
可以匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。http://www.runoob.com/regexp/regexp-syntax.html
先找从字符串开头起的
\s
:^\s+
- 再找字符串结尾的
\s
:\s+$
- 将找到的字符串替换为空
''
结论
根据上面的思路,表达式也就出来了:
1 | let email = email.replace(/^\s+|\s$/g, '') |
其中/g
是用于全局替换的,如果不加/g
,那么当开头和结尾都有空格等符号时,仅会替换开头部分。
http://www.runoob.com/jsref/jsref-regexp-g.html