Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解析URL的语法与正则表达式?_Java_Regex - Fatal编程技术网

Java 解析URL的语法与正则表达式?

Java 解析URL的语法与正则表达式?,java,regex,Java,Regex,URL中提到了URL的BNF形式: 我需要做的是从html文本中提取URL。现在我想知道我能代表谁 String alpha = "[a-zA-Z]"; String alphadigit = "[a-zA-Z0-9]"; String domainlabel = alphadigit+"|"+alphadigit+"("+alphadigit+"|-)*?"+alphadigit; //String toplabel

URL中提到了URL的BNF形式:

我需要做的是从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.regex方法一起用于从文本中提取URL。这是正确的方法吗?如果它是正确的,那么为什么我们需要编写上下文无关的语法呢?regex方法有哪些缺点

此外,对于语法分析器,比如对于语言,语法用于验证代码是否遵循语法规则,否则会显示一些错误消息。还使用语法,我们得到一个语法树,用于计算表达式。对于URL的事情,我们没有回避任何事情。我们只需要从文本的其余部分提取URL

我得到这个问题,因为之前我试图解析电子邮件地址。在彻底搜索正则表达式之后,没有一个结果是100%准确的,并且有人就正则表达式的局限性发表了一些评论,以匹配RFC中电子邮件地址的确切BNF形式。因此,可能需要语法而不是正则表达式。因此,我有一个关于URL的问题


谢谢

好吧,我认为你的问题可以更容易地解决,使用一些关于http链接在自由文本中的外观的启发式方法。它可能比如此复杂的regexp工作得更快,特别是当我们谈论大文本时:

http链接url以唯一的http开头:// 从开始到结束的URL不包含一些字符集,例如空格。当你们遇到这样的字符时,意味着你们找到了URL的结尾。
如果您要提取的URL位于诸如锚定标记的href属性之类的标记中,那么我建议使用JSoup来解析和检查HTML


在正文中,我确信一种更简单的正则表达式方法是可能的,也许在协议http://

上匹配只是为了确保您知道非ASCII URL,不是吗?您为什么希望这样做?您确定这是一种好方法吗?因为我要处理成千上万的网页,如果我做这个URL检查的话,每个网页都会产生不必要的异常。此外,在我的例子中,url甚至可能不包含http部分,那么它肯定会给出格式错误的url异常。事实上,如果它们都包含http,那么我一开始就不会有问题。对不起,我认为我犯了一个错误http://| https://?是的,这就是问题所在。我将解析craigslist网页,文本是手动输入的,不考虑任何形式。所以有些URL可能是这样的::atlanta。因此,我必须严格遵守正则表达式,以排除发生这种情况的可能性,即我不是100%依赖,因为一些精神错乱的用户可能会输入URL,而不考虑正确的标点符号和结构,期望文章的读者自己理解。因此,我对任何试探法都没有100%的信心。好吧,任何URL最终都可以自由包含位置词,因为命名资源的规则可以自由地为本地资源命名。在纯文本广告中,你会看到错误的斜杠http:\\example.com,quotes-1.com等。显然,现代浏览器和电子邮件客户端让很多东西都可以点击。