Регулярное выражение для разделения на разделителе

#java #regex

#java #регулярное выражение

Вопрос:

У меня есть следующая строка:

 ;Spe ,:; cial;;;
 

и я хочу разделить его точкой с запятой в качестве разделителя, однако точка с запятой, перед которой стоит «», не должна учитываться как разделитель. Итак, я хотел бы получить что-то вроде

 ["", "Spe ,:; cial", "", "", ""]
 

Обновить:

Представление Java выглядит следующим образом:

 String s = ";Spe \,\:\; cial;;;";
 

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

1. Используя обратную косую черту в качестве управляющего символа, как вы хотите обрабатывать «\;»? (т.е. Точка с запятой с двойной обратной косой чертой)

2. Да, извините. \; следует рассматривать как разделитель — это (экранированная) обратная косая черта плюс точка с запятой.

Ответ №1:

Используйте отрицательный анализ:

 (?<!\\);
 

(Обратите внимание, что в этом выражении действительно есть только один символ — т. Е. Выражение должно быть (?<!); — но символ обратной косой черты должен быть экранирован дважды: один раз для удобства компилятора Java и снова для удобства механизма регулярных выражений.)

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

1. Возможно, я делаю что-то неправильно: синтаксическая ошибка U_REGEX_MISMATCHED_PAREN рядом с индексом 6 (<!);

2. Код: String s = ";Spe \,\:\; cial;;;"; String[] strs = s.split("(<!\);", 5);

3. Ах, хорошо, вам может понадобиться "(?<!\\);" — экранирование once в интересах компилятора Java и его повторное экранирование в интересах механизма регулярных выражений.

Ответ №2:

Вы хотите извлечь части, захваченные следующим регулярным выражением: ;?([^;]*)\\?; так что ищите этот шаблон в своей строке до тех пор, пока не будет найдено совпадение :

 Pattern pattern = Pattern.compile(";?([^;]*)\\?;");
Matcher matcher = pattern.matcher(yourString);
List<String> tokens = new ArrayList<String>();
while(matcher.find()){
   tokens.add(matcher.group(1));
}

String[] yourArray = tokens.toArray(new String[0]); // if you prefer an array 
                                                    // rather than a list
 

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

1. Я получил «U_REGEX_MISSING_CLOSE_BRACKET» в первой строке.

2. toArray всегда возвращает Object[] use toArray(new String(0)) для получения String[]

3. Да, я не должен был ставить обратную косую черту в первой части, и я забыл дважды экранировать вторую. Теперь это должно быть хорошо.