Обработка разделителя с escape-символами в методе Java String.split()
Я искал в Интернете по моему запросу, но не получил ответа, который точно соответствует моему требованию. У меня есть строка, как показано ниже:
A|B|C|The Steading\|Keir Allan\|Braco|E
Мой вывод должен выглядеть следующим образом:
A
B
C
The Steading|Keir Allan|Braco
E
Мое требование - пропустить разделитель, если ему предшествует escape-последовательность. Я пробовал использовать отрицательные lookbehinds в String.split()
:
(?<!\\)\|
Но моя проблема заключается в том, что разделитель будет определяться конечным пользователем динамически, и не обязательно всегда |
. Это может быть любой символ на клавиатуре (без ограничений). Следовательно, я сомневаюсь, что указанное выше регулярное выражение может не работать для некоторых специальных символов, которые не разрешены в регулярном выражении.
Я просто хотел узнать, подходит ли это для этого.
Ответы
Ответ 1
Вы можете использовать Pattern.quote()
:
String regex = "(?<!\\\\)" + Pattern.quote(delim);
Используя ваш пример:
String delim = "|";
String regex = "(?<!\\\\)" + Pattern.quote(delim);
for (String s : "A|B|C|The Steading\\|Keir Allan\\|Braco|E".split(regex))
System.out.println(s);
A
B
C
The Steading\|Keir Allan\|Braco
E
Вы можете расширить это, чтобы использовать пользовательскую управляющую последовательность:
String delim = "|";
String esc = "+";
String regex = "(?<!" + Pattern.quote(esc) + ")" + Pattern.quote(delim);
for (String s : "A|B|C|The Steading+|Keir Allan+|Braco|E".split(regex))
System.out.println(s);
A
B
C
The Steading+|Keir Allan+|Braco
E