Java регулярное выражение, чтобы найти все слова в пути разделенного URL - PullRequest
0 голосов
/ 16 октября 2018

Итак, у меня есть этот 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 голосов
/ 16 октября 2018

Я предлагаю свой ответ с акцентом на «минимальные» изменения в вашем коде.Обратите внимание, что этот код на самом деле не «готов к работе» и, безусловно, требует определенного переосмысления множества частей, включая использование статических методов, обработку исключений и т. Д., Но, безусловно, будет отличным прототипом для вас (который, я полагаю, ваш фрагмент кодатакже!).Он также создан таким образом, чтобы вы могли легко отлаживать код.

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 , и в этом коде может возникать чувство чрезмерной инженерии, т. Е. Когда вы смотрите на деталь, чтобы убедиться, что список не содержит строку с нулевым значением.Также имейте в виду, что 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 + " ");
}
0 голосов
/ 16 октября 2018

Один из подходов состоит в том, чтобы удалить первый компонент 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...