2014-07-07 37 views
3

我將在我的應用程序中添加對通配符的支持。通配符域驗證器

它應該符合下面的要求。通配符必須包含:

- UTF-8 alphabetical characters 
- .,*,^,+,?,$,[],[^],:,/ 
- Domain parts other than the last may begin with a digit(from RFCs) 

而且用戶可以指定簡單的域名作爲test.test

的想法是應該做的兩個步驟:

  1. 驗證通配符是否有以下模式匹配:

    ^[\\pL0-9\\[\\].^$?*+:/]+。如果它匹配,嘗試編譯爲java模式。

  2. 如果沒有最後的正則表達式匹配,則認爲是簡單的域名,並使用谷歌圖書館com.google.common.net.InternetDomainName

驗證它,但我不知道過去的做法是否會覆蓋所有可能的情況

作爲例子,當我指定這樣的域: test.10它與模式匹配,但它不符合關於域中的數字的第三個要求。

如果您的建議解釋瞭如何滿足所有定義的要求,這將是一件好事。在這種情況下也很好地瞭解更好的解決方案。

+0

'(^ [\\ pL0-9 \\ [\\]^$ * +:/?]。+ \\)?^ [\\ PL \ \ [\\]。^ $?* +:/] +' – Valen

+0

感謝您的快速回答。我已經嘗試過你的模式。但不幸的是,它不能按預期工作。因此,它與以下認爲符合第三條要求的域名不符:10test.com,test.10test.com – fashuser

回答

1

如果域的最後一部分,不應包含任何數字:

^(?:[\p{L}\p{Nd}\x2A\x2B\x2F\x3A\x3F\x5B\x5D\x5E]+[\x2E])+[\p{L}\x2A\x2B\x2F\x3A\x3F\x5B\x5D\x5E]+$ 

爲Java的String上述正則表達式:

"^(?:[\\p{L}\\p{Nd}\\x2A\\x2B\\x2F\\x3A\\x3F\\x5B\\x5D\\x5E]+[\\x2E])+[\\p{L}\\x2A\\x2B\\x2F\\x3A\\x3F\\x5B\\x5D\\x5E]+$" 

如果只有最後一部分的第一個字符的域名應該不是數字:

(?:[\p{L}\p{Nd}\x2A\x2B\x2F\x3A\x3F\x5B\x5D\x5E]+[\x2E])+[\p{L}\x2A\x2B\x2F\x3A\x3F\x5B\x5D\x5E][\p{L}\p{N}\x2A\x2B\x2F\x3A\x3F\x5B\x5D\x5E]+ 

上述正則表達式如Java字符串:

"(?:[\\p{L}\\p{Nd}\\x2A\\x2B\\x2F\\x3A\\x3F\\x5B\\x5D\\x5E]+[\\x2E])+[\\p{L}\\x2A\\x2B\\x2F\\x3A\\x3F\\x5B\\x5D\\x5E][\\p{L}\\p{N}\\x2A\\x2B\\x2F\\x3A\\x3F\\x5B\\x5D\\x5E]+"