![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Есть текстовый файл. Из него необходимо вырезать комментарии.
1) комментарии отделены от текста двумя линиями из дефисов; текст текст текст --------------------------- здесь комментарий --------------------------- текст текст текст 2) комментарий не может начинаться с цифры 3) длина комментария не может быть более одной строки (любой длины) 4) могут идти два комментария подряд: текст текст текст --------------------------- здесь комментарий --------------------------- здесь комментарий --------------------------- текст текст текст В прикрепленном файле исходник. Это сообщение отредактировал(а) Suppir - 11.2.2011, 15:21 Присоединённый файл ( Кол-во скачиваний: 8 ) ![]() |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Решаемая ли это задача с помощью регулярных выражений?
А вот как должно получиться (файл прикрепил). Это сообщение отредактировал(а) Suppir - 11.2.2011, 15:15 Присоединённый файл ( Кол-во скачиваний: 7 ) ![]() |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
у вас неопределенность -- последний комментарий (который идет с одной линией) может быть только последним
это так и надо? |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
arto,
это не комментарий одной линией. Это двойной комментарий вида текст текст текст --------------------------- здесь комментарий --------------------------- здесь комментарий --------------------------- текст текст текст Вся проблема в этих неопределенностях. Нужно точно определять, где мы находимся, внутри комментария или текста, чтобы случайно не отрезать текст. Добавлено через 5 минут и 55 секунд Еще раз прикрепил оба файла в архиве. Там хорошо видно, как было, и как должно получиться. Присоединённый файл ( Кол-во скачиваний: 3 ) ![]() |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
никак.
если вы поставите двойной комментарий в середине текста, разобраться сможет только автор текста и комментария. выделяйте комментарии правильно. |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
arto,
Думаю, что это можно сделать, благодаря следующей информации: 1) комментарий не может начинаться на цифру 2) комментарий всегда состоит из одной строки. |
|||
|
||||
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 1 Всего: 14 |
||||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
alezzz, здорово!!! Понятное дело, я привел только упрощенный пример (на самом деле все гораздо сложнее). Если у меня еще возникнут вопросы, я в этой же теме напишу. Это сообщение отредактировал(а) Suppir - 11.2.2011, 15:30 |
|||
|
||||
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 1 Всего: 14 |
||||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
alezzz,
на самом деле в 95% случаев длина равна одной строке. Но иногда бывает по несколько строк. Но при этом строки внутри коммента никогда не начинаются на цифру. Можно ли этот случай учесть? |
|||
|
||||
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 1 Всего: 14 |
Ну тогда оставляйте как есть. В 95% случаев должно работать правильно
![]() Это сообщение отредактировал(а) alezzz - 11.2.2011, 15:40 |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
alezzz, из-за этих 5% все алгоритмы сбиваются :
|
|||
|
||||
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 1 Всего: 14 |
вот еще вариант, надеюсь перекроет 5%
|
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
# perl -0777 -plne 's/^-+\n(?:(?:^[^\d].*\n)+^-+\n)+//mg;'
text A ------------------ comment 1 ------------------ text B ------------------ comment 1.7 ------------------ text C ^D text A text C # |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
alezzz,
Вот такой код работает - удаляет случай, когда в комментарии по 2 строки сразу (и только): $text =~ s/^\s*-+\n((^\s*[^\d].*\n){2}^\s*-+\n)+//mg; а такой код слишком много удаляет: $text =~ s/^\s*-+\n(?:(?:^\s*[^\d].*\n)+^\s*-+\n)+//mg; Добавлено через 3 минуты и 35 секунд Я прикрепил к сообщению архив с более сложным случаем (по несколько строк в одном комменте). Добавлено через 6 минут и 46 секунд Кажется, вот такой код заработал: $text =~ s/^ {3}-+\n(?:(?:^ {3}[^\d].*\n)+^ {3}-+\n)+//mg; а вот этот код не работал из-за \s* $text =~ s/^\s*-+\n(?:(?:^\s*[^\d].*\n)+^\s*-+\n)+//mg; Присоединённый файл ( Кол-во скачиваний: 1 ) ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |