Регулярное выражение, как разделить с |и избегая раскола, когда \ до - PullRequest
4 голосов
/ 07 октября 2011

У меня есть следующий текст

 aaa|bbbb|cccc|dddd\|eeee|ffff

и я хочу разделить на | и исключая, когда | предшествует \ и получить

ааа

BBBB

сссс

дддд \ | ээээ

FFFF

Спасибо.

ps: я пытался использовать генератор регулярных выражений (например, http://txt2re.com/), но, честно говоря, регулярные выражения совсем не дружелюбны.

обновление: наконец я сдаюсь. Regexp не быстрый (я сделал тест), ни один не ясен (по сравнению с функцией, которой может следовать каждый), затем я пропускаю его, и теперь я использую реальный код.

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

Пытался добавить это как комментарий к ответу без век, но не знаю, как его там отформатировать ...

Во всяком случае, ответ без век мне кажется правильным:

    String str = "aaa|bbbb|cccc|dddd\\|eeee|ffff";
    String[] tokens = str.split("(?<!\\\\)\\|");
    System.out.println(Arrays.toString(tokens));    

который печатает:

[aaa, bbbb, cccc, dddd\|eeee, ffff]
2 голосов
/ 07 октября 2011

Это должно сделать это:

(?<!\\\\)\\|

Если вы хотите разрешить обратную косую черту с обратной косой чертой, вы можете использовать:

(?<!(?<!\\\\)\\\\)\\|

Таким образом, учитывая строку aaa|bbbb|cccc|dddd\|eeee\\|ffff, разделение будет:


    aaa
    bbbb
    cccc
    dddd|eeee\*
    ffff

* Или dddd\|eeee\\, если вы по какой-то причине не снимаете обратную косую черту.

Редактировать: не знаком со вкусом регулярных выражений Java, добавлены экранированные значения для каждого комментария фаната храповика.

1 голос
/ 14 марта 2012

Не используйте split() для этого.(Вы могли бы, если бы Java поддерживала неопределенное повторение внутри утверждений за кадром. Но это не так.)

Лучше собрать все совпадения между | s:

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("(?:\\\\.|[^\\\\|])*");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    matchList.add(regexMatcher.group());
}

Это правильно разбивает aaa|bbbb\\|cccc|dddd\|eeee|ffff\\\|ggg\\\\|hhhh в

aaa
bbbb\\
cccc
dddd\|eeee
ffff\\\|ggg\\\\
hhhh
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...