【问题标题】:Very Simple Regex Question非常简单的正则表达式问题
【发布时间】:2010-06-08 14:29:21
【问题描述】:

我有一个非常简单的正则表达式问题。假设我有两个条件:

  1. 网址=http://www.abc.com/cde/def
  2. 网址=https://www.abc.com/sadfl/dsaf

如何使用正则表达式提取 baseUrl?

样本输出:

  1. http://www.abc.com
  2. https://www.abc.com

【问题讨论】:

  • 这看起来就像家庭作业
  • @Gyom 这看起来不像家庭作业

标签: java regex


【解决方案1】:

像这样:

String baseUrl;
Pattern p = Pattern.compile("^(([a-zA-Z]+://)?[a-zA-Z0-9.-]+\\.[a-zA-Z]+(:\d+)?/");
Matcher m = p.matcher(str); 
if (m.matches())
    baseUrl = m.group(1);

但是,您应该改用URI class,如下所示:

URI uri = new URI(str);

【讨论】:

  • 感谢您的快速回复,但它给了abc.comsadfl 它有可能只给第一个abc.com
  • 这不适用于页面源。假设我在 google 上搜索字符串“sun”,它将提供 20 个链接,我想获取所有站点的基本 url,但这不适用于页面源html 页面。任何更改,以便它可以用于页面源。谢谢 。等待回复。
  • 删除^,它将正则表达式锚定到字符串的开头。然后,您可以遍历每个匹配项。
【解决方案2】:

没有正则表达式的单行:

String baseUrl = url.substring(0, url.indexOf('/', url.indexOf("//")+2));

【讨论】:

  • :) 感谢您的回答,但我想使用正则表达式
【解决方案3】:

/^(https?\:\/\/[^\/]+).*/$1/

这将捕获以 http 开头的任何内容,并且 $1 将包含从开头到第一个 / 之后的所有内容 //

【讨论】:

  • 感谢您的快速回复
【解决方案4】:

除了写入和丢弃脚本之外,您应该始终避免使用正则表达式解析复杂的语法(电子邮件地址、url、html 页面等)。

相信我,你最终被咬。

【讨论】:

    【解决方案5】:

    我很确定有一个允许路径操作的 Java 类,但如果它必须是一个正则表达式,

    https?://[^/]+
    

    会起作用的。 (包括s? 也可以处理https:

    【讨论】:

      【解决方案6】:

      看起来你的两个具体例子最简单的解决方案是模式:

      [^/]_//[^/]+
      

      即:非斜线(0 次或多次)、两个斜线、非斜线(0 次或多次)。如果你愿意,你可以比这更严格,因为现有的两个答案以不同的方式做——一个会拒绝,例如以ftp: 开头的 URL,另一个将拒绝带有下划线的域(但接受没有前导 protocol:// 的 URL,因此在这方面比我的更广泛)。各种各样的答案(所有正确的关于您的规格不足;-)应该向您表明您的规格过于模糊,应该收紧。

      【讨论】:

      • 感谢您的快速回复先生
      【解决方案7】:

      这是一个应该满足给定问题的正则表达式。

      https?://[^/]*
      

      我假设您问这个部分是为了获得更多关于正则表达式的知识。但是,如果您尝试从 URL 中提取主机,则可以说使用 Java 更强大的解析方法更正确:

      String urlStr = "https://www.abc.com/stuff";
      URL url = new URL(urlStr);
      String host = url.getHost();
      String protocol = url.getProtocol();
      URL baseUrl = new URL (protocol, host);
      

      这样会更好,因为如果您的输入 URL 不像上面描述的那么严格,它应该会捕获更多的情况。

      【讨论】:

      • 感谢您的快速回答先生
      【解决方案8】:

      老帖子..我想我不妨对一个简单的正则表达式 Q 做一个简单的回答:

      (http|https):\/\/(www.)?(\w+)?\.(\w+)?

      【讨论】:

        猜你喜欢
        • 2011-05-13
        • 2011-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        相关资源
        最近更新 更多