Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сложная задачка на регулярные выражения, Вырезать из файла строки 
:(
    Опции темы
Suppir
Дата 11.2.2011, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Есть текстовый файл. Из него необходимо вырезать комментарии.

1) комментарии отделены от текста двумя линиями из дефисов;


текст текст текст
---------------------------
здесь комментарий
---------------------------
текст текст текст



2) комментарий не может начинаться с цифры

3) длина комментария не может быть более одной строки (любой длины)

4) могут идти два комментария подряд:


текст текст текст
---------------------------
здесь комментарий
---------------------------
здесь комментарий
---------------------------
текст текст текст


В прикрепленном файле исходник.




Это сообщение отредактировал(а) Suppir - 11.2.2011, 15:21

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  ____.txt 2,78 Kb
PM MAIL   Вверх
Suppir
Дата 11.2.2011, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Решаемая ли это задача с помощью регулярных выражений?

А вот как должно получиться (файл прикрепил).

Это сообщение отредактировал(а) Suppir - 11.2.2011, 15:15

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  _____.txt 2,78 Kb
PM MAIL   Вверх
arto
Дата 11.2.2011, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



у вас неопределенность -- последний комментарий (который идет с одной линией) может быть только последним
это так и надо?
PM MAIL ICQ   Вверх
Suppir
Дата 11.2.2011, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



arto,

это не комментарий одной линией. Это двойной комментарий вида 


текст текст текст
---------------------------
здесь комментарий
---------------------------
здесь комментарий
---------------------------
текст текст текст



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

Добавлено через 5 минут и 55 секунд
Еще раз прикрепил оба файла в архиве. Там хорошо видно, как было, и как должно получиться.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  text.ZIP 1,46 Kb
PM MAIL   Вверх
arto
Дата 11.2.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



никак.
если вы поставите двойной комментарий в середине текста, разобраться сможет только автор текста и комментария.

выделяйте комментарии правильно.
PM MAIL ICQ   Вверх
Suppir
Дата 11.2.2011, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



arto

Думаю, что это можно сделать, благодаря следующей информации:
1) комментарий не может начинаться на цифру
2) комментарий всегда состоит из одной строки. 


PM MAIL   Вверх
alezzz
Дата 11.2.2011, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



Цитата(Suppir @  11.2.2011,  15:01 Найти цитируемый пост)
Решаемая ли это задача с помощью регулярных выражений?


Попробуйте так:
Код

$text =~ s/^-+\n(?:^[^\d].*\n^-+\n)+//mg;


В $text полностью весь текст.
PM MAIL   Вверх
Suppir
Дата 11.2.2011, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет




alezzz, здорово!!!

Понятное дело, я привел только упрощенный пример (на самом деле все гораздо сложнее). Если у меня еще возникнут вопросы, я в этой же теме напишу.

Это сообщение отредактировал(а) Suppir - 11.2.2011, 15:30
PM MAIL   Вверх
alezzz
Дата 11.2.2011, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



Должно работать даже без [^\d], главное чтобы
Цитата(Suppir @  11.2.2011,  15:00 Найти цитируемый пост)
3) длина комментария не может быть более одной строки


PM MAIL   Вверх
Suppir
Дата 11.2.2011, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



alezzz

на самом деле в 95% случаев длина равна одной строке. Но иногда бывает по несколько строк. Но при этом строки внутри коммента никогда не начинаются на цифру. Можно ли этот случай учесть?


PM MAIL   Вверх
alezzz
Дата 11.2.2011, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



Ну тогда оставляйте как есть. В 95% случаев должно работать правильно smile. Если комментарий из нескольких строк, то тогда действительно сложная задачка.

Это сообщение отредактировал(а) alezzz - 11.2.2011, 15:40
PM MAIL   Вверх
Suppir
Дата 11.2.2011, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



alezzz, из-за этих 5% все алгоритмы сбиваются :
PM MAIL   Вверх
alezzz
Дата 11.2.2011, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 1
Всего: 14



вот еще вариант, надеюсь перекроет 5%
Код

$text =~ s/^-+\n(?:(?:^[^\d].*\n)+^-+\n)+//mg;

PM MAIL   Вверх
arto
Дата 11.2.2011, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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
#
PM MAIL ICQ   Вверх
Suppir
Дата 11.2.2011, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 )
Присоединённый файл  text2.ZIP 1,54 Kb
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0878 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.