【发布时间】:2010-06-08 14:29:21
【问题描述】:
我有一个非常简单的正则表达式问题。假设我有两个条件:
如何使用正则表达式提取 baseUrl?
样本输出:
【问题讨论】:
-
这看起来就像家庭作业
-
@Gyom 这看起来不像家庭作业
我有一个非常简单的正则表达式问题。假设我有两个条件:
如何使用正则表达式提取 baseUrl?
样本输出:
【问题讨论】:
像这样:
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);
没有正则表达式的单行:
String baseUrl = url.substring(0, url.indexOf('/', url.indexOf("//")+2));
【讨论】:
/^(https?\:\/\/[^\/]+).*/$1/
这将捕获以 http 开头的任何内容,并且 $1 将包含从开头到第一个 / 之后的所有内容 //
【讨论】:
除了写入和丢弃脚本之外,您应该始终避免使用正则表达式解析复杂的语法(电子邮件地址、url、html 页面等)。
相信我,你会最终被咬。
【讨论】:
我很确定有一个允许路径操作的 Java 类,但如果它必须是一个正则表达式,
https?://[^/]+
会起作用的。 (包括s? 也可以处理https:)
【讨论】:
看起来你的两个具体例子最简单的解决方案是模式:
[^/]_//[^/]+
即:非斜线(0 次或多次)、两个斜线、非斜线(0 次或多次)。如果你愿意,你可以比这更严格,因为现有的两个答案以不同的方式做——一个会拒绝,例如以ftp: 开头的 URL,另一个将拒绝带有下划线的域(但接受没有前导 protocol:// 的 URL,因此在这方面比我的更广泛)。各种各样的答案(所有正确的关于您的规格不足;-)应该向您表明您的规格过于模糊,应该收紧。
【讨论】:
这是一个应该满足给定问题的正则表达式。
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 不像上面描述的那么严格,它应该会捕获更多的情况。
【讨论】:
老帖子..我想我不妨对一个简单的正则表达式 Q 做一个简单的回答:
(http|https):\/\/(www.)?(\w+)?\.(\w+)?
【讨论】: