#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[]
usetoArray(new String(0))
для полученияString[]
3. Да, я не должен был ставить обратную косую черту в первой части, и я забыл дважды экранировать вторую. Теперь это должно быть хорошо.