2010-07-29 39 views
3

我做了一個XML Schema,我在裏面有這個。我的正則表達式有問題嗎?

<xs:element name="Email"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
      <xs:pattern value="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"/> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 

一些我在我的XML文檔失敗的一個電子郵件,我得到這個錯誤

電子郵件」元素是無效的 - 值 ‘[email protected]’根據 無效其數據類型'字符串' - 模式約束失敗。 LineNumber上:15404 LinePostion:32

所以只看途經的所有電子郵件和失敗我注意到,所有失敗的那些有「_(下劃線)」的人。所以我不確定這是否是原因。

編輯

所以我改變了我的正則表達式來此

<xs:pattern value="[\w_]+([-+.'][\w_]+)*@[\w_]+([-.][\w_]+)*\.[\w_]+([-.][\w_]+)*"/> 

現在的作品,但不明白爲什麼\w沒有捕捉它。

+4

看起來你已經確定了這個問題 - 你的正則表達式根本沒有提到下劃線。 – 2010-07-29 21:49:10

+0

字符類'\ w'不應該包含下劃線嗎? – 2010-07-29 21:50:48

+0

嗯看到我使用程序expresso來幫助我編寫我的正則表達式,並且它帶有下劃線來捕獲事物,這很奇怪。另外,我認爲這是我剛剛從.net電子郵件驗證器獲得的。另外我認爲orangeoctopus是正確的\ w應該趕上它。 – chobo2 2010-07-29 21:53:53

回答

6

W3C Recommendation on datatypes定義\w爲:(除一套 「標點」, 「分離器」 和 「其他」 的字符中的所有字符)*

underscore character definition in Unicode是'

[#X0000-#x10FFFF]-[\p{P}\p{Z}\p{C}] LOW LINE'(U + 005F),類別:標點符號,連接器[Pc]

所以XML Schema更符合Unicode定義處理字符類。

但對於電子郵件的正則表達式,你shold使用嚴格的ASCII,像[0-9A-Za-z_-]這一翻譯的\w(我敢打賭,與nonlatin字符的電子郵件地址無效:)),但更好的是要找到一個成熟的正則表達式的語法,或可考慮RFC ,什麼是正確的電子郵件格式

+0

我更新了上面的格式和鏈接,但沒有與內容相抵觸。最後一段是不正確的;請參閱[RFC 5336](https://tools.ietf.org/html/rfc5336),其中涵蓋[國際化電子郵件地址](https://en.wikipedia.org/wiki/International_email)(儘管電子郵件中的實際表示由於[RFC 5322](https://tools.ietf.org/html/rfc5322)要求標頭全部爲ASCII,因此標頭必須進行編碼)。還要注意一個_comprehensive_正則表達式匹配所有可能的地址幾乎是不可能的。 – 2016-03-16 17:17:47

0

是的。您不匹配下劃線字符。剛剛嘗試添加它...

\w+([-+.'_]\w+)*... 
1

東西是奇怪,因爲\w通常接受下劃線。嘗試將_添加到\w,您將期望_,通過將它們更改爲[\w_]

+0

嗯,這似乎工作。我不明白爲什麼\ w不抓住他們。 – chobo2 2010-07-30 00:24:05

0

事實上有些奇怪;由於\w字符類包含下劃線,正如我們可以看到的Rubular,您應該驗證的電子郵件。是否有可能還有另一個問題 - 比如說流浪的空間?但是,另一個問題是沒有正確接受所有電子郵件地址的正則表達式。 this Stack Overflow question有一個很好的答案。處理驗證電子郵件地址可能比這個模式/正則表達式更好。

+0

嗯,我不認爲有任何流浪的空間(非我可以看到)。我添加了「_」來包含這個,它起作用(請參閱我的編輯) – chobo2 2010-07-30 00:25:45