我有一个非常简单的正则表达式问题。假设我有两个条件:
如何使用正则表达式提取baseUrl?
示例输出:
我有一个非常简单的正则表达式问题。假设我有两个条件:
如何使用正则表达式提取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
类,像这样:URI uri = new URI(str);
^
,这个符号将正则表达式锚定在字符串的开头。然后你可以循环遍历每一个匹配。 - SLaks一行不使用正则表达式的代码:
String baseUrl = url.substring(0, url.indexOf('/', url.indexOf("//")+2));
/^(https?\:\/\/[^\/]+).*/$1/
这将捕获任何以http开头的内容,$1将包含从开头到//后第一个/之间的所有内容。
除了编写并丢弃的脚本外,您应该始终避免使用正则表达式解析复杂的语法(如电子邮件地址、URL、HTML页面等等)。
相信我,您最终一定会受到影响。
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不像上面描述的那么严格,它应该可以捕获更多的情况。
旧帖子..我想我不妨给一个简单的正则表达式问题提供一个简单的答案:
(http|https):\/\/(www.)?(\w+)?\.(\w+)?