正则表达式2-邮箱的故事
匹配邮箱
在《正则表达式1-字符串匹配种》,我们知道如何去匹配名称了,现在来看看一个更复杂的例子,邮箱吧。
我们看一下这个邮箱的组成
405062429@qq.com
405062429是邮箱名称,qq.com是域名。
点
我们如何匹配呢?看看这个行不行
'405062429@qq.com'.match(/\w+@\w+.\w+/)
好像可以,但是‘405062429@qq+com‘也能被匹配,这是因为我们用到了'.'.
.在正则表达式中表示元字符(Metacharacter),是具有特殊含义的字符,表示查找单个字符,除了换行和行结束符。
在这里我们需要Escape the “.” with a backslash to match a literal period。使用.转译一下。
所以这样写吧:
'405062429@qq.com'.match(/\w+@\w+\.\w+/)
分组
我们邮箱的顶级域名(Top-level Domain)不一定是com怎么办。看看下面这样写可以吗?
/\w+@\w+\.com|net|org|edu/i
这样的话并不能把com和net,org,edu放在一起,而是把\w+@\w+\.com
和后面的域名放在一起了,显然不对,这时候就要用到分组。像下面这样写:
/\w+@\w+\.(com|net|org|edu)/i
部分匹配
上面这样已经可以工作的很好了,可是还是有部分匹配的问题。比如'405062429@qq.comXXX'.match(/\w+@\w+\.(com|net|org|edu)/i)
也会返回(我们希望精确匹配,这种情况应该返回null)。
如何解决这个问题呢:
/^\w+@\w+\.(com|net|org|edu)$/i
^表示在一行的开头就开始匹配,start matching at the beginning of the line
$表示在一行的结尾结束匹配,stop matching at the end of the line
说的明白点就是,比如/^shen$/
,那么shen
之前没有任何东西,之后也没有任何东西,那么就只能匹配shen
。这样就可以解决部分匹配的问题了。