[英]Validating email address with single character domain-names with a regex
我有一個正則表達式,用於驗證電子郵件地址。 我喜歡此正則表達式,因為它相當放松,並且已經證明可以很好地工作。
這是正則表達式:
(['\"]{1,}.+['\"]{1,}\s+)?<?[\w\.\-]+@[^\.][\w\.\-]+\.[A-Za-z]{2,}>?
好的,基本上您可以扔給它的所有合理有效的電子郵件地址都將得到驗證。 我知道,即使是一些無效的,也可能會掉線,但這對於我的特定用例來說是可以的。
現在碰巧是joe@x.com無法驗證的情況。 並猜測x.com實際上是一個存在的域名(由paypall擁有)。
查看驗證域名的正則表達式部分:
@[^\.][\w\.\-]+
看起來這應該能夠解析x.com域名,但事實並非如此。 罪魁禍首是檢查域名不能以點開頭的部分(例如test @ .test.com)
@[^\.]
如果我刪除了正則表達式的[^。]部分,則域x.com會進行驗證,但是現在正則表達式允許以點開頭的域名,例如.test.com;。 這是一個有點太為我放松;-)
所以我的問題是,否定字符列表部分如何影響我的單字符檢查,基本上我正在閱讀正則表達式的方式是:“確保此字符串不以點開頭”,但顯然它會做得更多。
任何幫助,將不勝感激。
問候,
瓦塞姆
如路易斯建議的那樣,您可以使用[^\\.][\\w\\.\\-]*
來匹配domtain名稱,但是現在它也將匹配john@x.....com
和john@@.com
地址john@@.com
。 您可能要確保一次只存在一個句點,並且@之后的第一個字符比不僅僅是句點受到更多的限制。
使用以下方式匹配域名和期間(以及子域及其期間):
([\w\-]+\.)+
因此,您的模式將是:
(['\"]{1,}.+['\"]{1,}\s+)?<?[\w\.\-]+@([\w\-]+\.)+[A-Za-z]{2,}>?
如果將[^\\.][\\w\\.\\-]+
更改為[^\\.][\\w\\.\\-]*
,它將正常工作!
原因是: [^\\.]
將匹配不是點的單個字符(在您的情況下,是“ x.com”上的“ x”,那么您將嘗試達到1個或多個字符,然后是一個點。您將在x后面匹配點,並且不再有點匹配。*將在第一個之后匹配0個或多個字符,這是您想要的。
將表示一個或多個的量詞+更改為表示零個或多個的*。
將@[^\\.][\\w\\.\\-]+
更改為@[^\\.][\\w\\.\\-]*
您需@[^\\.][\\w\\.\\-]*
的原因是[^\\.]
表示匹配單個字符不是一個點。 現在再也沒有字符了,所以即使加號要求至少一個字符, [\\w\\.\\-]+
也沒有匹配的字符。 將加號更改為星號可以解決此問題。
查看您的模式中的更廣泛的上下文:
@[^\.][\w\.\-]+\.[A-Za-z]{2,}
所以對於joe@x.com
,
[^.]
匹配x
[\\w.-]+
匹配.
\\.
需要一個點但找到c
將此部分更改為@[^.][\\w-]*\\.[A-Za-z]{2,}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.