2016-11-29 14 views
1

Нужно разбить строку с помощью разделителя, но только в том случае, если перед разделителем нет обратной косой черты.разброс regex на основе точного символа, за исключением случаев, когда он сбрасывается с обратным слэшем перед ним

ex: если есть abc \:abc - не разбивайте его, как : имеет обратную косую черту перед ним.

если строка abc : abc - необходимо разбить как abc, abc.

Разделители могут быть :,|,& т.д.

+0

Вы хотите уйти от обратной косой черты, например. 'abc \\: def' разбивать на' 'abc \' 'и' def'? –

+0

Привет, его интересный тестовый файл. yes \\ должны быть вместе и: должны использоваться для разделения в этом случае. – Paulena

ответ

2

Используйте отрицательный (?<!...) просмотра назад. Чтобы соответствовать буквальной обратной косой чертой \, вам нужно дважды уйти. Однажды убежать, потому что это строковый литерал, и снова, потому что это символ escape регулярного выражения.

String[] parts = string.split("(?<!\\\\)[:,|&]"); 
+0

Еще один приятный момент для комментариев - это то, что lookarounds _assert_, но не потребляет. Это поведение, которое требуется, чтобы использовать фактический разделитель, оставив неизменяемый символ. –

1

Используйте в качестве просмотра назад выражение раскола:

String input = "abc \\:abc def : def"; 
String[] parts = input.split("(?<=[^\\\\]):"); 
            ^^^^ split on any non-slash 
             followed by delimiter 

IDEOne

+0

@ 4castle Я проверил ваш негативный lookbehind, и он также кажется, что работает. Спасибо за редактирование. –

+0

Спасибо, и никаких проблем. Просто примечание для OP, единственная разница между нашими ответами заключается в том, как регулярное выражение обрабатывает разделитель в начале строки. Например, если строка была ': abc', ваша не разделилась бы, а моя была бы. Может быть, что этот угловой случай никогда не случится. – 4castle

+0

Вы должны использовать '(? Bohemian