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

Поиск:

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


Опытный
**


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

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



Добрый день!

В переменной $a содержится следующий текст:

------------------------------------------------------------------------------------------------------------------------------------------------------
Величина
\par\pard\plain
\intbl\fi720\qj\hyphpar1

показателя
\qc\hyphpar1
\cell
\row

\trowd\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10\trbrdrl\brdrs\brdrw10\trbrdrb\brdrs\brdrw10\trbrdrr\brdrs\brdrw10
------------------------------------------------------------------------------------------------------------------------------------------------------


Необходимо перед строчкой "\par\pard\plain" добавить строчку "\qc\hyphpar1"

но только в том случае, если:
1) где-то ниже есть строчка "\cell"
2) между строчкой "\cell" и строчкой "\par\pard\plain" нет строчки "\trowd"


Т.е. необходимо преобразовать переменную к виду:

------------------------------------------------------------------------------------------------------------------------------------------------------
Величина
\qc\hyphpar1
\par\pard\plain
\intbl\fi720\qj\hyphpar1

показателя
\qc\hyphpar1
\cell
\row

\trowd\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10\trbrdrl\brdrs\brdrw10\trbrdrb\brdrs\brdrw10\trbrdrr\brdrs\brdrw10
------------------------------------------------------------------------------------------------------------------------------------------------------



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


сплю...
**


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

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



Только одним регулярным выражением? Одним пока не получается, но буду пробовать smile.

Код

$a =~ /\\par\\pard\\plain/;
$' =~ /\\cell/;
if ($` !~ /\\trowd/)
{
  $a =~ /\\par\\pard\\plain/;
  print "$`\\qc\\hyphpar1\n$&$'";
}
else
{
  print $a;
}

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


Опытный
**


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

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



Да, нужно только одним регулярным выражением.
Потому что будет использоваться не с Perl, а с PCRE.
PM MAIL   Вверх
Pfailed
Дата 8.12.2010, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

$a = 
'<root>
<needle>
<false />
</needle>

<needle>
<true />
</needle>
</root>';


$a =~ s!
(
<needle>
.*?
</needle>
)
!
index($1, "<false />") == -1 ? "<ok />\n$1" : $1
!xseg;

print $a, "\n";




--------------------
PM MAIL   Вверх
patap
Дата 8.12.2010, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

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



должно вернуть подстроку \par\pard\plain, если удовлетворит двум условиям

Код

(?(?!\\par\\pard\\plain.*?\\trowd.*?\\cell)(?(?=.*?\\cell)(\\par\\pard\\plain)))


Это сообщение отредактировал(а) patap - 8.12.2010, 18:43


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


Опытный
**


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

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



Спасибо! 

Получилось сделать более простым способом (но не в одно регулярное выражение):


        local $spl = StringSplit($rtf, @CRLF, 3)
        
        local $cell = 0
        for $x = 0 to Ubound ($spl) - 1
                if StringRegExp($spl[$x], "\\cell$") Then $cell = 0
                if StringRegExp($spl[$x], "\\trowd\\") Then $cell = 1
                if StringRegExp($spl[$x], "\\par\\pard\\plain") And $cell = 1 Then $spl[$x] = "\qc\hyphpar1\par\pard\plain"
        Next    

(это не Perl, но регулярки PCRE)

Добавлено через 5 минут и 55 секунд
P.s. Пишу скрипт, который в делает пакетную замену с помощью регулярных выражений в RTF-данных.

Пользователь выделяет в программе (типа ворда) "грязный" текст и нажимает хоткей.
Скрипт вытягивает RTF-данные через буфер обмена, перекодирует, обрабатывает множеством регулярных выражений, после чего аккуратно вставляет обратно в буфер.
Потом посылает программно CTRL+INSERT - и вуаля, в программе у пользователя чистенький, красиво отформатированный текст. smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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