Регулярное выражение с -,::, (и)
Мне нужно разбить строку
(возраст-это-25:: ИЛИ:: last_name-это-Qa6):: И::( возраст-это-20:: ИЛИ:: first_name-содержит-тест)
в
string [0] = (age-is-25:: OR:: last_name-is-qa6)
string [1] = AND
string [2] = (age-is-20:: OR:: first_name-contains-test)
Я пробовал писать так много выражений регулярных выражений, но ничего не работает так, как ожидалось.
Используя следующее regex, Matcher.groupCount(), который возвращает 2, но присваивая результаты арреалисту, возвращает null в качестве элементов.
Шаблон шаблона = Pattern.compile( "(\\)::)? | (:: \\()?" );
Я попытался разбить его, используя):: или:: (.
Я знаю, что регулярное выражение выглядит слишком глупо, но, будучи новичком, это лучшее, что я мог бы написать.
Ответы
Ответ 1
Вы можете использовать позитивный lookahead и lookbehind для соответствия первой и последней скобкам.
String str = "(age-is-25::OR::last_name-is-qa6)::AND::(age-is-20::OR::first_name-contains-test)";
for (String s : str.split("(?<=\\))::|::(?=\\()"))
System.out.println(s);
Выходы:
(age-is-25::OR::last_name-is-qa6)
AND
(age-is-20::OR::first_name-contains-test)
Просто заметка: похоже, вы разбираете какой-то рекурсивный язык. Регулярные выражения не подходят для этого. Если вы выполняете расширенный анализ, я бы рекомендовал вам посмотреть на другие методы анализа.
Ответ 2
Мне кажется, что большая часть вашего стресса исходит из необходимости избегать специальных символов в вашем поисковом выражении. Я настоятельно рекомендую не выполнять ручное экранирование специальных символов, а вместо этого использовать Pattern.quote(...) для экранирования.
Ответ 3
Это должно работать
"(?<=\\))::|::(?=\\()"
Ответ 4
textString.split("\\)::|::\\(")
должен работать.
Ответ 5
Это должно сработать для вас.
\)::|::\(