Java正则表达式在拆分的URL路径中查找所有单词

时间:2018-10-16 08:34:58

标签: java regex url

所以我有这个URL路径,该路径由“ /”分隔。 例: 强制网址路径:https://www.uni.it/it/ateneo-org_plot-pesc/organ/organi-amm/rettore-o_0-rect 分割路径如下:

it
ateneo-org_plot-
organ
organi-amm
rettore-o_0-rect

我想要的输出是:

it
ateneo
org
plot
organ
organi
amm
rettore
o
0
rect

我尝试过这样的事情:

public static List<String> extractAllWordsFromUrlPath(String link) {
    List<String> splittedUrlPath = splitLinkPath(link);
    List<String> urlWords = new ArrayList<String>();
    if(splittedUrlPath!=null && splittedUrlPath.size()>0) {
        Pattern linkWordsPattern = Pattern.compile("[-_]?[a-z]+[-_]?");
        for(String sPath: splittedUrlPath) {


        Matcher lwpm = linkWordsPattern.matcher(sPath);
        while(lwpm.find()) {
            urlWords.add(lwpm.group());
        }
        }
    }

    return urlWords;
}

2 个答案:

答案 0 :(得分:1)

一种方法是在第一个路径分隔符之前删除URL的第一个组件。然后,在[/_-]上分割剩余的字符串:

String url = "https://www.uni.it/it/ateneo-org_plot-pesc/organ/organi-amm/rettore-o_0-rect"; 
URL theURL = new URL(url);
String path = theURL.getPath();
String[] parts = path.split("[/_-]");

for (String part : parts)  {
    System.out.println(part + " ");
}

it ateneo org plot organ organi amm rettore o 0 rect

请注意,我使用java.net.URL从输入URL中提取路径。我们也可以尝试通过正则表达式进行此操作,但是它可能容易出错或无法涵盖所有​​可能的URL类型。

答案 1 :(得分:1)

我提供了我的答案,重点是对您的代码的“最小”更改。请注意,此代码并不是真正的“生产就绪型”,并且绝对需要在许多部分上进行某些重新思考,包括静态方法的使用,处理异常等,但是对于您来说绝对是一个不错的原型(我想您的代码段是以及!)。它也是通过这种方式创建的,可让您轻松地通过代码进行调试。

public static List<String> extractAllWordsFromUrlPath(String link) throws MalformedURLException {

    String path = new URL(link).getPath();
    String regex = "[/_-]";  // set somewhere in config file, input as method argument?
    String[] extractedWords = path.split(regex);
    List<String> result = Arrays.asList(extractedWords);

    return result.stream().filter(w -> (w != null && w.length() > 0)).collect(Collectors.toList());
}

方法返回List只是为了跟上您的决定。 请注意,流是Java 8的功能,并且该代码中可能会有一些过度设计的感觉,即,当您在确保列表中不包含空值String的情况下进行检查。 另外请记住, Arrays.asList()返回为不可变列表,以防万一您曾经使用它来转换数组以在代码的其他部分列出。

您可以使用其他方法中的for(String word : parsedWords )解决方案来验证此代码,因此也可以将其与@Tim Bergenstein的解决方案结合使用,因此我也支持他的回答,它提供了很好的基础,我只是扩展了它可以处理空字符串,空值,快速异常处理和一些命名规范:

//code in your other method, of main class, just for testing
List<String> parsedWords = extractAllWordsFromUrlPath("http://www.google.com/asd/asd/dfg/kjg");
for(String word: parsedWords) {
    System.out.println(word + " ");
}