Как разделить на основе ключевых слов в регулярном выражении, а затем пробелов в Java?

#java #regex #matching

Вопрос:

Я хотел бы разделить строку на основе трех факторов.

  1. Регулярное выражение не учитывает регистр
  2. Если строка содержит какие-либо термины «Раскаленный докрасна», «Ледяной», «Теплый» или «Мягкий», Например, если строка «Раскаленный докрасна ледяной», при запуске .split(регулярное выражение) в строке я должен получить массив с «Раскаленный докрасна» и «Ледяной» как две отдельные записи.
  3. Если строка не соответствует ни одному из терминов, она должна быть разделена на основе пробелов. Так, например, если строка «Красный лед», она должна разделиться на массив, содержащий «Красный» и «Лед». В настоящее время он разделяется на «Красный лед» как одна запись в массиве. Если строка «Red hot Ice cold red», она должна разделиться на массив, содержащий «Red hot», «Ice cold» и «red». В настоящее время он делится на «Красный горячий» и «Ледяной красный».

До сих пор регулярное выражение, которое у меня есть, "(?i)s(?=("Red hot"|"Ice cold"|"Warm"|"Mild"))"

Как добавить критерии, по которым, если ни один из терминов не совпадает, он должен разделяться пробелом? Я не понимаю, как добавить приоритет регулярному выражению. Спасибо всем!

Ответ №1:

Я бы предложил подход к сопоставлению шаблонов регулярных выражений, который сначала чередует термины из нескольких слов, а затем все остальные термины из одного слова:

 String input = "I at some red hot not mild food and drank an ice cold Coke";
Pattern r = Pattern.compile("(?i)\b(?:Red hot|Ice cold|\w )\b");
Matcher m = r.matcher(input);
List<String> matches = new ArrayList<>();
while (m.find()) {
    matches.add(m.group());
}
System.out.println(matches);
 

Это печатает:

 [I, at, some, red hot, not, mild, food, and, drank, an, ice cold, Coke]
 

Обратите внимание, что, поскольку Warm и Mild являются отдельными словами, ваше разделение по умолчанию на поведение с пробелами уже должно включать их.

Комментарии:

1. Привет, спасибо за ответ, я ценю это! Что, если бы я разделился на Раскаленное Докрасна, Ледяное, Теплое и Мягкое и полностью проигнорировал все остальные слова? Могу ли я просто удалить \w в конце? Когда я это делаю, я получаю пустые строки в совпадениях. Спасибо!

2. В этом случае вы бы открыли новый вопрос, так как я уже ответил на вопрос, который вы на самом деле задали выше.