【发布时间】:2016-02-18 06:32:22
【问题描述】:
考虑这个正则表达式:
static String AdrPattern="(?:http://www\\.([^/&]+)\\.com/|(?!^)\\G)/?([^/]+)";
我有两个小问题:
- 如何使它匹配只有
域名,没有任何进一步的路径/段? (如
https://stackoverflow.com) - 如何使此正则表达式匹配具有不同域扩展名的 URL?
P.S:正则表达式取自 here 并且工作正常,但这两个缺点应该得到修复。
编辑
根据下面的代码,对这篇文章的回答将跳过进一步的部分,只打印域名:
static String AdrPattern= "(?:(?!\\A)\\G(?:/([^\\s/]+))|http://www\\.([^\\s/&]+)\\.(?:com|net|gov|org)(?:/([^\\s/]+))?)";
static Pattern WebUrlPattern = Pattern.compile (AdrPattern);
WebUrlMatcher= WebUrlPattern.matcher(line);
int cn=0;
while(WebUrlMatcher.find()) {
if (cnt == 0)
{
String extractedPath = WebUrlMatcher.group(1);
if(extractedPath!=null){
fop.write(prefix.toLowerCase().getBytes());
fop.write(System.getProperty("line.separator").getBytes());
}
if(extractedPath!=null)
{
fop.write(extractedPath.toLowerCase().getBytes());
fop.write(System.getProperty("line.separator").getBytes());
}
String extractedPart = WebUrlMatcher.group(2);
String extractedPart = WebUrlMatcher.group(2);
String extracted2=WebUrlMatcher.group(3);
if(extractedPart!=null)
{
fop.write(extractedPart.toLowerCase().getBytes());
fop.write(System.getProperty("line.separator").getBytes());
if(extracted2!=null)
{
fop.write(extracted2.toLowerCase().getBytes());
fop.write(System.getProperty("line.separator").getBytes());
}
cnt = cnt + 1;
}
}
}
}
【问题讨论】:
-
你能提供应该和不应该匹配的 URL 示例吗?
-
@TimBiegeleisen 总之,我想要所有的 URL 匹配,但我也想要,对于那些有更多路径/段的,它分别返回它们。换句话说,我想访问这些细分市场。结果,生成了该正则表达式,但它跳过了具有单个路径的 URL,如所示示例。此外,它一次仅适用于单个域扩展。如果可能,我想要这两个修复?
-
这不是一个词,它是一个段落,它仍然让我不确定你到底想要什么。在 Stack Overflow 上,一张图片值一千字。
-
所以你希望它在可用时同时匹配域 和 段?
-
@sln 完全正确。但这个正则表达式没有。此外,它一次应该不止匹配一个域扩展。