#java #regex #matching
Вопрос:
Я хотел бы разделить строку на основе трех факторов.
- Регулярное выражение не учитывает регистр
- Если строка содержит какие-либо термины «Раскаленный докрасна», «Ледяной», «Теплый» или «Мягкий», Например, если строка «Раскаленный докрасна ледяной», при запуске .split(регулярное выражение) в строке я должен получить массив с «Раскаленный докрасна» и «Ледяной» как две отдельные записи.
- Если строка не соответствует ни одному из терминов, она должна быть разделена на основе пробелов. Так, например, если строка «Красный лед», она должна разделиться на массив, содержащий «Красный» и «Лед». В настоящее время он разделяется на «Красный лед» как одна запись в массиве. Если строка «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. В этом случае вы бы открыли новый вопрос, так как я уже ответил на вопрос, который вы на самом деле задали выше.