Разбить строку, но пропустить разделители в кавычках (Средствами регэкспов)

Модератор: Модераторы разделов

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Разбить строку, но пропустить разделители в кавычках

Сообщение serzh-z »

Может кто предложит более умный/красивый механизм:

есть вызов preg_split("/;/", 'start;"path;test";end'). Не принципиально - ПХП и preg_split, Пёрл и split это или ещё что.

Нужно разбить строку на start, "path;test" и end... В общем застрял. Нужно, чтобы ";" встречающийся в тексте, который заключён в кавычки был проигнорирован и не использовался в качестве разделителя. Вводить символ экранирования для ";" не слишком катит.

Т.е. нужно написать соответствующий регэксп.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Разбить строку, но пропустить разделители в кавычках

Сообщение Liksys »

поставь булево значение на пробег по строке, как только встречается первая кавычка, бул ставится в истину и делай так:
if ( (status == true) && (c == ';') )
continue;
гле статус - булева цифра, а с - текущий символ. Как только встречается вторая кавычка, status устанавливается в противоположное значение.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Разбить строку, но пропустить разделители в кавычках

Сообщение serzh-z »

Ммм... Мне сложный регэксп нужен, который скажет "точка с запятой, но только не та, которая ключена в закавыченный текст"...
Спасибо сказали:
Nab
Сообщения: 257

Re: Разбить строку, но пропустить разделители в кавычках

Сообщение Nab »

Единственное что я пока придумал, это для перла
split('(\"[^\"]*\")?;(\"[^\"]*\")?', 'start;"path;test";end'))
но этот вариант хоть и справляется с задачей, но при этом создает кучу пустых элементов....
надо еще подумать...
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Разбить строку, но пропустить разделители в кавычках

Сообщение serzh-z »

М-да... Вот так:

Код: Выделить всё

split('(?:\":[^\"]*\")*;(?:\"[^\"]*\")*', 'start;"path;test";end');


не создаёт. Но тогда теряется та часть, что была в кавычках. Чую - "истина где-то рядом".
Спасибо сказали:
Nab
Сообщения: 257

Re: Разбить строку, но пропустить разделители в кавычках

Сообщение Nab »

Мне кажется задача через split не решаема :(

Ведь ему нужно указать выражение которое разделяет элементы....
А указать более точный регексп без захвата, и анализа соседних символов не реально, то есть они тоже попадут в это выражение....
Может и возможно состряпать хитрое выражение с обратными ссылками и т.д. , но необходимо досконально знать как работает split и как он внутри это все проворачивает...

По моему все же проще делать обработку первоначальную строки, или результата...
Ну или отказаться от split вообще...
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Разбить строку, но пропустить разделители в кавычках

Сообщение serzh-z »

Решил пока снизить отложить проблему, а в последствии экранировать символом "|", т.к. там реально используется виндовый путь, в котором могла встретиться ";".
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Разбить строку, но пропустить разделители в кавычках

Сообщение v04bvs »

Вот код на perl, который решает эту задачу. Правда не через split.

Код: Выделить всё

$_ = 'start;"path;test";end';
while(/(^|;)("[^"]*"|[^;]*)/g) {
    print "$2\n"
}
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Разбить строку, но пропустить разделители в кавычках

Сообщение serzh-z »

Ок. Спасибо.
Спасибо сказали: