Возник вопрос. Необходимо разобрать строку. В строке содержатся ключевые слова, которые я знаю заранее и мне надо вытащить всё, что между данными словами находится.
Например:
Категория Косметика Подкатегория Масла Объем (мл) 25
Из этой строки необходимо составить набор записей (для этого использую HashMap<String, String>) и получить необходимо набор записей по типу (key, value) (Категория, Косметика), (Подкатегория, Масла), (Объем (мл), 25).
Так как получаю строку с известными key, то остается выбрать лишь value.
pattern = Pattern.compile(".*?" + info.get(k) + " (.*?) " + info.get(k+1));
В info хранятся ключи. Столкнулся с проблемой нахождения записи подкатегории и объема в строке. Возникает скорее всего из-за (мл) у объема, но как это решить не совсем понятно.
Тут необходимо использовать Pattern.quote для экранирования любых специальных символов регулярок, а также добавить |\s*\z к info.get(k+1), чтобы найти совпадение также в конце строки.
Pattern pattern = Pattern.compile(Pattern.quote(info.get(k)) + "\\s+(.*?)(?:\\s+" + Pattern.quote(info.get(k+1)) + "|\\s*\\z)");
Например, при последней итерации регулярка будет выглядеть примерно так:
\QОбъем (мл)\E\s+(.*?)(?:\s+|\s*\z)
См. демо
Подробности
\Q - далее все символы перестают быть специальными ("режим буквального текста")Объем (мл) - фраза (подстрока) Объем (мл)\E - конец режима буквального текста\s+ - 1+ пробельных символов(.*?) - Захватывающая подмаска №1: 0 и более символов, отличных от символов перевода строки, как можно меньше(?: - начало подмаски:
\s+ - 1+ пробельных символов| - или\s*\z - 0+ пробельных символов и самый конец строки) - конец подмаски.Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости