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

9

1
这看起来就像是作业。 - Gyom
4
好的,我将尽力进行翻译。@Gyom 这根本不像作业。 - Michael Mrozek
8个回答

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,像这样:
URI uri = new URI(str);

感谢您的快速回复,但它给出了 https://www.abc.com 和 sadfl,是否可能只提供第一个 https://www.abc.com? - Sunil
这个在页面源代码中不起作用。假设我在谷歌上搜索一个字符串“sun”,它会给出20个链接,我想获取所有网站的基本URL,但是在HTML页面的页面源代码上无法实现。有什么改变可以让它在页面源代码上起作用吗?谢谢。等待回复。 - Sunil
移除 ^,这个符号将正则表达式锚定在字符串的开头。然后你可以循环遍历每一个匹配。 - SLaks

2

一行不使用正则表达式的代码:

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

谢谢您的回答,但我想使用正则表达式。 - Sunil

1

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

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


1

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

相信我,您最终一定会受到影响。


0
我很确定有一个Java类可以允许路径操作,但如果必须使用正则表达式,
https?://[^/]+

这将起作用。(包括s?以处理https:


0

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

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

即:非斜杠(0次或多次),两个斜杠,非斜杠(0次或多次)。如果您愿意,可以更加严格,因为两个现有的答案以不同的方式进行了处理 - 其中一个将拒绝以ftp:开头的URL,另一个将拒绝带有下划线的域名(但接受没有前导protocol://的URL,因此在这方面比我的范围还要广泛)。这些答案的多样性(都符合您的简要规格;-)应该提示您,您的规格过于模糊,应该加以明确。


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

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


0

旧帖子..我想我不妨给一个简单的正则表达式问题提供一个简单的答案:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接