非常简单的正则表达式问题

时间:2010-06-08 14:29:21

标签: java regex

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

  1. url = http://www.abc.com/cde/def
  2. url = https://www.abc.com/sadfl/dsaf
  3. 如何使用正则表达式提取baseUrl?

    示例输出:

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

8 个答案:

答案 0 :(得分:8)

像这样:

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);

答案 1 :(得分:2)

没有正则表达式的单线:

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

除了写入和丢弃脚本之外,总是不要使用正则表达式来解析复杂的语法(电子邮件地址,网址,html页面等)。

相信我,你最终会被咬伤。

答案 4 :(得分:0)

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

https?://[^/]+

会奏效。 (包含s?也可以处理https:

答案 5 :(得分:0)

对于您的两个具体示例,最简单的解决方案似乎是模式:

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

即:非斜线(0次或更多次),两次斜杠,非斜杠(0次或更多次)。如果你愿意,你可以比这更严格,因为现有的两个答案是以不同的方式做的 - 一个人会拒绝,例如以ftp:开头的网址,另一个会拒绝带有下划线的网址(但接受没有前导protocol://的网址,因此在这方面甚至比我的更广泛)。这些答案(所有正确的,你的规格都不正确;-)应该告诉你,你的规格太模糊,应该收紧。

答案 6 :(得分:0)

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

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);

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

答案 7 :(得分:0)

旧帖子..我想我也可以对一个简单的正则表达式问一个简单的答案:

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