| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > Разбиение по символу |
| Автор: JAPH 20.4.2007, 18:03 | ||
| Вопрос следующего плана. Имеется строка some operation; one else operation; operation with ';'; and with ` ;`; with "`;'" also possible (':)'); Необходимо её разбить по точке с запятой, но только если она вне кавычек. Таким образом, нужно получить
|
| Автор: KSURi 20.4.2007, 20:26 | ||||
Только почему-то получается, что and with ` ;`; захватывается не правильно =\
|
| Автор: JAPH 20.4.2007, 20:41 |
Потому что строка ;` соответствует шаблону ;[^']. Но даже если дополнить: ;[^'"`], это будет неправильно себя вести на строках вроде something ' containing ; in the center ' of the substring |
| Автор: nitr 20.4.2007, 22:09 | ||||
| JAPH, думаю все же сложный синтак. анализатор получится, на одних регулярках будет не просто сделать :( хотя все же задачка решаема...
прошу оптимизацией самим заниматься ;) , но анализатор, имхо, "на лицо" Если что, поясню код Добавлено через 10 минут и 38 секунд хех... вот тож самое
|
| Автор: Nab 21.4.2007, 03:29 | ||||||
У меня получилось вот такое:
Использовал альтернативы, потому как если заюзаем обратные ссылки, то они тоже попадут в вывод, что нам не нужно... То есть вот такой код тоже работает, но он отдает и закавыченные места, и просто мусорит
Мой код тоже не идеален, он отдает пустое соответствие после каждого найденного :(, пока не знаю как избавиться... То есть можно еще так проверить, чтобы получить только значимые результаты:
|
| Автор: Nab 21.4.2007, 04:59 | ||
Это мы делали через split, если делать поудобней, то вот так получаеться самый супер вариант:
|
| Автор: nitr 21.4.2007, 19:00 |
| Nab, JAPH, привел пример: something ' containing ; in the center ' of the substring, у меня твой не сработал :( P.S.: но мне понравилось ;) |
| Автор: nitr 21.4.2007, 19:46 |
только с данным определением на Си была практика в написании синтак. анализатора ;) По поводу регеспов соглашусь, поэтому и писал А так в перл, на один вопрос "тыщу" ответов ;) хе хе. Мой без регеспов (то что там есть - не считается А так твой код мне по душе |
| Автор: JAPH 21.4.2007, 20:40 | ||
Спасибо, набросали возможных решений. Я думаю в том же направлении, что и Nab. Так как получающийся список будет обрабатываться в foreach, хотелось бы уместить это в одну регулярку. В общем, пока решением считаю доработанный вариант Nab`а с учётом возможности существования строк вида some string ' with escaped \' quotes ; and ' so on...;. Пустые поля (как между ;;) должны сохраняться, новых появляться не должно. Так что эта строка будет разбита на всё, кроме последней точки с запятой, и нечто пустое. Итак, вариант:
Проверяем, улучшаем, придираемся. Ну и в качестве нарушения всех правил форума вопрос по форуму. Как вы делаете надпись "Добавлено через 2 минуты"? |
| Автор: nitr 21.4.2007, 20:49 | ||
JAPH,
форум думаю хранит сессию..., потом смотрит, если моя мессага последняя, то добавляет тег перед моей новой мессагой [mergetime]время в секундах с 1900 (вроде)[/mergetime] вроде так |
| Автор: Nab 21.4.2007, 22:11 | ||
| Блин, JAPH, без пол-литры не разобраться Поначалу я тоже хотел сделать на конструкциях предварительного и постусловий, но мне показалось удобней указать что должно быть, чем нахождение разделителя... Я вот поглядел, и вроде как разобрал твой код... и вижу что тебе опятьже приходиться делать альтернативу для каждой кавычки, спецом чтоб не создавать найденных ссылок $1, $2 и т.д. Я опять пошел путем универсальности и предлагаю такой вариант:
|
| Автор: Nab 22.4.2007, 09:19 | ||
Кстати я вот подумал, что эт получаеться весьма мощная универсальная функция, разбиения строк по символу, с учетом закавыченных строк:
Первым параметром принимает символ, а вторым строку, возвращает список полученных подстрок. Символ должен быть один... в качестве разделителя больше одного не прокатит, ну или надо переписать и выделить разделитель как одну лексему.... |
| Автор: JAPH 22.4.2007, 13:04 | ||
Nab, один махонький недочёт в строке 3:
А так здорово |