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

Обработка разделителя с 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():

(?<!\\)\|

Но моя проблема заключается в том, что разделитель будет определяться конечным пользователем динамически, и не обязательно всегда |. Это может быть любой символ на клавиатуре (без ограничений). Следовательно, я сомневаюсь, что указанное выше регулярное выражение может не работать для некоторых специальных символов, которые не разрешены в регулярном выражении.

Я просто хотел узнать, подходит ли это для этого.

4b9b3361

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