![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| JAPH |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Вопрос следующего плана. Имеется строка
some operation; one else operation; operation with ';'; and with ` ;`; with "`;'" also possible (':)'); Необходимо её разбить по точке с запятой, но только если она вне кавычек. Таким образом, нужно получить
-------------------- Что непонятно - спрашиваем |
|||
|
||||
| KSURi |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Только почему-то получается, что and with ` ;`; захватывается не правильно =\
Это сообщение отредактировал(а) KSURi - 20.4.2007, 20:26 -------------------- Died at Life.pl line 21 |
||||
|
|||||
| JAPH |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Потому что строка ;` соответствует шаблону ;[^']. Но даже если дополнить: ;[^'"`], это будет неправильно себя вести на строках вроде something ' containing ; in the center ' of the substring -------------------- Что непонятно - спрашиваем |
|||
|
||||
| nitr |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
JAPH, думаю все же сложный синтак. анализатор получится, на одних регулярках будет не просто сделать :(
хотя все же задачка решаема...
прошу оптимизацией самим заниматься ;) , но анализатор, имхо, "на лицо" Если что, поясню код Добавлено через 10 минут и 38 секунд хех... вот тож самое
|
||||
|
|||||
| Nab |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
У меня получилось вот такое:
Использовал альтернативы, потому как если заюзаем обратные ссылки, то они тоже попадут в вывод, что нам не нужно... То есть вот такой код тоже работает, но он отдает и закавыченные места, и просто мусорит
Мой код тоже не идеален, он отдает пустое соответствие после каждого найденного :(, пока не знаю как избавиться... То есть можно еще так проверить, чтобы получить только значимые результаты:
-------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||||
|
|||||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Это мы делали через split, если делать поудобней, то вот так получаеться самый супер вариант:
-------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Nab, JAPH, привел пример:
something ' containing ; in the center ' of the substring, у меня твой не сработал :( P.S.: но мне понравилось ;) Это сообщение отредактировал(а) nitr - 21.4.2007, 19:28 |
|||
|
||||
| Nab |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Конечно не сработает, потому как нет ни одного реального разделителя в виде ';' нужно мой код исправить так:
то есть в нем тоже убрать точку с запятой, так как регексп основан на отрицании символов, то ничего страшного не случиться... она по идее даже лишней была. Нет, nitr, не понимаю, хотя догадуюсь о чем ты.... Учитывая что эт я тебя познакомил с "конечными автоматами" А вот применение конечных автоматов в более высокоуровневых конструкциях и организации машин состояний, очень даже полезная вещь, и ты это очень хорошо показал в топике по разбору внутренних таблиц в HTML. Так как он достаточно сложен чтоб разобрать его одной регуляркой, то там этот метод очень даже подходящий. Очень хорошо такая схема работает при паралельных работах, таких как POE, там даже методы определяющие интерфейс зовуться inline_state, object_state и т.д. хотя это немного не та машина состояний, которая идет отдельным компонентом... Я эт говорю к тому, что не стоит пытаться применить новую технологию везде -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||
|
|||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
только с данным определением на Си была практика в написании синтак. анализатора ;) По поводу регеспов соглашусь, поэтому и писал А так в перл, на один вопрос "тыщу" ответов ;) хе хе. Мой без регеспов (то что там есть - не считается А так твой код мне по душе |
|||
|
||||
| JAPH |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Спасибо, набросали возможных решений. Я думаю в том же направлении, что и Nab. Так как получающийся список будет обрабатываться в foreach, хотелось бы уместить это в одну регулярку. В общем, пока решением считаю доработанный вариант Nab`а с учётом возможности существования строк вида some string ' with escaped \' quotes ; and ' so on...;. Пустые поля (как между ;;) должны сохраняться, новых появляться не должно. Так что эта строка будет разбита на всё, кроме последней точки с запятой, и нечто пустое. Итак, вариант:
Проверяем, улучшаем, придираемся. Ну и в качестве нарушения всех правил форума вопрос по форуму. Как вы делаете надпись "Добавлено через 2 минуты"? -------------------- Что непонятно - спрашиваем |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
JAPH,
форум думаю хранит сессию..., потом смотрит, если моя мессага последняя, то добавляет тег перед моей новой мессагой [mergetime]время в секундах с 1900 (вроде)[/mergetime] вроде так |
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Блин, JAPH, без пол-литры не разобраться
Поначалу я тоже хотел сделать на конструкциях предварительного и постусловий, но мне показалось удобней указать что должно быть, чем нахождение разделителя... Я вот поглядел, и вроде как разобрал твой код... и вижу что тебе опятьже приходиться делать альтернативу для каждой кавычки, спецом чтоб не создавать найденных ссылок $1, $2 и т.д. Я опять пошел путем универсальности и предлагаю такой вариант:
-------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Кстати я вот подумал, что эт получаеться весьма мощная универсальная функция, разбиения строк по символу, с учетом закавыченных строк:
Первым параметром принимает символ, а вторым строку, возвращает список полученных подстрок. Символ должен быть один... в качестве разделителя больше одного не прокатит, ну или надо переписать и выделить разделитель как одну лексему.... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| JAPH |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 3 Всего: 23 |
Nab, один махонький недочёт в строке 3:
А так здорово Это сообщение отредактировал(а) JAPH - 22.4.2007, 20:47 -------------------- Что непонятно - спрашиваем |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |