Гамбо был прав, используя проверочное утверждение , но если ваша строка содержит экранированный escape-символ (например, \\
) прямо перед запятой, разделение может прерваться. Смотрите этот пример:
test1\,test1,test2\\,test3\\\,test3\\\\,test4
Если вы выполните простое предварительное разбиение для (?<!\\),
, как предложил Гамбо, строка разбивается только на две части test1\,test1
и test2\\,test3\\\,test3\\\\,test4
. Это связано с тем, что предварительный просмотр просто проверяет один символ на наличие escape-символа. Что было бы на самом деле правильно, если строка разбита на запятые и запятые, перед которыми стоит четное число escape-символов.
Для достижения этой цели требуется более сложное (двойное) выражение для поиска:
(?<!(?<![^\\]\\(?:\\{2}){0,10})\\),
Используя это более сложное регулярное выражение в Java, снова требуется экранировать все \
на \\
. Так что это должен быть более сложный ответ на ваш вопрос:
"any comma separated string".split("(?<!(?<![^\\\\]\\\\(?:\\\\{2}){0,10})\\\\),");
Примечание: Java не поддерживает бесконечные повторения внутри объектов обзора. Поэтому с помощью выражения {0,10}
проверяются только до 10 повторяющихся двойных escape-символов. При необходимости вы можете увеличить это значение, отрегулировав последнее число.