URL的BNF形式在URL中提到:語法與正則表達式解析URL?
http://www.w3.org/Addressing/rfc1738.txt
我需要做的是從HTML文本中提取的URL。現在,我不知道我能代表
String alpha = "[a-zA-Z]";
String alphadigit = "[a-zA-Z0-9]";
String domainlabel = alphadigit+"|"+alphadigit+"("+alphadigit+"|-)*?"+alphadigit;
//String toplabel = alpha+"|"+alpha+"("+alphadigit+"|-)*?"+alphadigit;
String toplabel = "com|org|net|mil|edu|(co\\.[a-z]+)";
String hostname = "(("+domainlabel+")\\.)*("+toplabel+")";
String hostport = hostname;
String lowalpha = "([a-z])";
String hialpha = "([A-Z])";
String alpha = "("+lowalpha+"|"+hialpha+")";
String digit = "([0-9])";
String safe = "($|-|_|.|\\+)";
String extra = "(!|\\*|'|\\(|\\)|,)";
//String national = "{" | "}" | "|" | "\" | "^" | "~" | "[" | "]" | "`";
String punctuation = "(<|>|#|%|\")";
String reserved = "(;|/|?|:|@|&|=)";
String hex = "("+digit+"[A-Fa-f]"+")";
String escape = "(%"+hex+hex+")";
String unreserved = "("+alpha+"|"+digit+"|"+safe+"|"+extra+")";
String uchar = "("+unreserved+"|"+escape+")";
String hsegment = "(("+uchar+"|;|:|@|&|=)*)";
String search = "("+uchar+"|;|:|@|&|=)?)";
String hpath = hsegment+"(/"+hsegment+")*";
//String httpurl = "http://"+hostport+"(/"+hpath+"(?"+search+")?)?";
String httpurl = "http://"+hostport+"/"+hpath;
最後的正則表達式:
http://(([a-zA-Z0-9]|[a-zA-Z0-9]([a-zA-Z0-9]|-)*?[a-zA-Z0-9])\.)*(com|org|net|mil|edu|(co\.[a-z]+))/(((((([a-z])|([A-Z]))|([0-9])|($|-|_|.|\+)|(!|\*|'|\(|\)|,))|(%(([0-9])[A-Fa-f])(([0-9])[A-Fa-f])))|;|:|@|&|=)*)(/(((((([a-z])|([A-Z]))|([0-9])|($|-|_|.|\+)|(!|\*|'|\(|\)|,))|(%(([0-9])[A-Fa-f])(([0-9])[A-Fa-f])))|;|:|@|&|=)*))*
所以你可以看到我所代表的整個BNF到大正則表達式,將與javax.util使用。正則表達式方法從文本中提取URL。現在這是正確的方法嗎?如果它是正確的,那麼爲什麼我們需要編寫一個上下文無關文法?正則表達式方法有什麼缺點?
此外,對於語法分析器來說,對於語言來說,語法用於驗證代碼是否遵循語法規則,否則會顯示一些錯誤消息。同樣使用語法,我們得到一個用於評估表達式的語法樹。對於URL的東西,我們沒有對任何東西進行任何處理我們只需要從其他文本中提取網址。
我得到了這個問題,因爲以前我試圖解析電子郵件地址。在詳盡地搜索正則表達式之後,他們都沒有發現100%的準確性,並且有人評論了正則表達式與RFC中的確切BNF形式的電子郵件地址相匹配的侷限性。因此可能需要語法(而不是正則表達式)。因此,我有這個問題的網址。
感謝
只是爲了確保,你是知道的非ASCII網址,不是嗎? – shabunc
爲什麼你想[重新發明輪子](http://stackoverflow.com/a/285880/878469)? – predi
你確定這是一個好方法嗎?因爲我會處理成千上萬的網頁,如果我做這個URL檢查的話,每個網頁都會產生不必要的異常。除了我的情況下的URL甚至可能不包含http部分,那麼它肯定會給出畸形的url異常。事實上,如果他們已經包含所有這些HTTP,那麼我首先不會有問題。 – user285825