簡體   English   中英

使用正則表達式驗證具有單個字符域名的電子郵件地址

[英]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.....comjohn@@.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM