Подтвердить что ты не робот

Регулярное выражение с -,::, (и)

Мне нужно разбить строку

(возраст-это-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( "(\\)::)? | (:: \\()?" );

Я попытался разбить его, используя):: или:: (.

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

4b9b3361

Ответ 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

Это должно сработать для вас.

\)::|::\(