1

URL の BNF 形式は、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])))|;|:|@|&|=)*))*

したがって、テキストから URL を抽出するために javax.util.regex メソッドで使用される大きな正規表現で BNF 全体を表したことがわかります。これは正しいアプローチですか?それが正しければ、なぜ文脈自由文法を書く必要があるのでしょうか? 正規表現アプローチにはどのような欠点がありますか?

さらに、文法パーサーの場合、たとえば言語の場合、文法は、コードが文法規則に従っているかどうかを検証するために使用されます。そうでない場合、いくつかのエラーメッセージが表示されます。また、文法を使用して、式の評価に使用される構文ツリーを取得します。URL については、何も評価しませんでした。残りのテキストから URL を抽出するだけです。

以前はメールアドレスを解析しようとしていたので、この質問を受けました。正規表現を徹底的に検索した結果、どれも 100% 正確であることが判明せず、RFC の電子メール アドレスの正確な BNF 形式と一致するための正規表現の制限に関していくつかのコメントが作成されました。したがって、(正規表現の代わりに) 文法が必要になる場合があります。したがって、URL についてこの質問があります。

ありがとう

4

2 に答える 2

0

抽出する URL がタグ (アンカー タグの href プロパティなど) 内にある場合は、JSoup を使用して HTML を解析および検査することをお勧めします。

http://jsoup.org/

テキストの本文内では、おそらくプロトコル (http://) で一致する、より単純な正規表現アプローチが可能であると確信しています

于 2013-06-04T07:54:04.983 に答える