我在我的應用程序中使用Patterns.WEB_URL.matcher(str)
來驗證應用程序中的URL。這個api在pre-Lollipop API中很有效。然而,在棒棒糖中它甚至驗證「abd.def」。奇怪和錯誤的行爲。任何建議/解決方案的想法?Patterns.WEB_URL.matcher錯誤行爲(str)
1
A
回答
5
奇怪的和錯誤行爲
使用固件出爐的正則表達式是由定義「馬車」。
頂級域名(TLD)列表一直在穩步擴大。任何試圖限制當時已知頂級域名的正則表達式最終都會過時。所以,12個月前,Google的工程師changed the regex to accept any TLD, so long as it uses the proper characters。另一種選擇是關於有效URL如何失敗正則表達式的一系列無盡的錯誤報告,當那些Android版本發佈時,這些URL將無效。
任何建議/想法的修復?
寫你自己的正則表達式。或者,分叉較舊的正則表達式並維護您自己的有效頂級域名列表。或者,通過其他方式驗證網址。或者,找一個人主動維護一個圖書館,讓你也可以這樣做,在那裏你確保你不斷更新你對圖書館的使用以考慮新的TLD。 IOW,做一些與固件無關的事情,並確保您保持對有效頂級域名(TLD)變更的準確性。
1
要在CommonsWare的答案擴大,這裏是我使用,以免Linkify聯看似隨意的文字:
Linkify.TransformFilter filter = new Linkify.TransformFilter() {
public final String transformUrl(final Matcher match, String url) {
return match.group();
}
};
Pattern webURL = Pattern.compile(new StringBuilder()
.append("((?:(http|https|Http|Https|rtsp|Rtsp):")
.append("\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)")
.append("\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_")
.append("\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?")
.append("((?:(?:[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}\\.)+") // named host
.append("(?:") // plus top level domain
.append("(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])")
.append("|(?:biz|b[abdefghijmnorstvwyz])")
.append("|(?:cat|com|coop|c[acdfghiklmnoruvxyz])")
.append("|d[ejkmoz]")
.append("|(?:edu|e[cegrstu])")
.append("|f[ijkmor]")
.append("|(?:gov|g[abdefghilmnpqrstuwy])")
.append("|h[kmnrtu]")
.append("|(?:info|int|i[delmnoqrst])")
.append("|(?:jobs|j[emop])")
.append("|k[eghimnrwyz]")
.append("|l[abcikrstuvy]")
.append("|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])")
.append("|(?:name|net|n[acefgilopruz])")
.append("|(?:org|om)")
.append("|(?:pro|p[aefghklmnrstwy])")
.append("|qa")
.append("|r[eouw]")
.append("|s[abcdeghijklmnortuvyz]")
.append("|(?:tel|travel|t[cdfghjklmnoprtvwz])")
.append("|u[agkmsyz]")
.append("|v[aceginu]")
.append("|w[fs]")
.append("|y[etu]")
.append("|z[amw]))")
.append("|(?:(?:25[0-5]|2[0-4]") // or ip address
.append("[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(?:25[0-5]|2[0-4][0-9]")
.append("|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1]")
.append("[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}")
.append("|[1-9][0-9]|[0-9])))")
.append("(?:\\:\\d{1,5})?)") // plus option port number
.append("(\\/(?:(?:[a-zA-Z0-9\\;\\/\\?\\:\\@\\&\\=\\#\\~") // plus option query params
.append("\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?")
.append("(?:\\b|$)").toString()
);
Linkify.addLinks(myTextView, webURL, null, null, filter);
相關問題
- 1. sparql STR錯誤
- 2. strcmp(x,str)是錯誤的?
- 3. 我的str類錯誤
- 4. 段錯誤中的atoi(STR)
- 5. Python的類型錯誤:不支持的操作類型爲 - :「STR」和「STR」
- 6. 當str有韓文字符時,java jlabel setText(str)錯誤
- 7. 爲什麼str [:len(str)/ 2]而不是str [:len(str)* 0.5]?
- 8. 錯誤:'str'對象沒有屬性'讀'
- 9. str在Python中不可調用錯誤
- 10. * str = c給我一個分段錯誤
- 11. 類型錯誤:unorderable類型:STR()<INT()
- 12. YAML加載期間的python str錯誤
- 13. TypeError:'str'對象不可調用錯誤
- 14. 錯誤:'str'對象不可調用python
- 15. 類型錯誤str是不可呼叫
- 16. var = str創建'ambiguous use of appendingPathComponent'錯誤
- 17. 錯誤操作數類型一元 - :「STR」
- 18. mysqldb更新函數Python錯誤str
- 19. 運行AWS Lambda時將str()錯誤(將uuid轉換爲字符串)w/Dynamo DB
- 20. TypeError:一元運算符類型錯誤+:'str'第15行?
- 21. Moviepy - 類型錯誤:無法將 '字節' 對象爲str隱含
- 22. coffeescript:爲什麼「str」.replace(// g,「」)給coffeescript編譯錯誤?
- 23. 類型錯誤:無法將「浮動」對象爲str隱含
- 24. TypeError:錯誤操作數類型爲一元 - :'str'
- 25. 值錯誤:無法將str轉換爲浮點數PYTHON
- 26. 不能轉換int對象爲str隱含錯誤
- 27. 「無法將int對象隱式轉換爲str」錯誤(Python)
- 28. 爲什麼Str [fix_num]產生錯誤的結果
- 29. Python錯誤類型錯誤:無法連接'str'和'float'對象
- 30. 錯誤在Python:類型錯誤:unorderable類型:STR()<int()函數
我推薦閱讀:[爲什麼我避免android.util.Patterns(HTTP://博客。 danlew.net/2014/05/22/why-i-dont-use-patterns/)。 – Ziem