информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеГде водятся OGRыСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Столлман возвращается в FSF 
 The Great Suspender предположительно... 
 Десятилетняя уязвимость в sudo 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Perl] Вопрос по регулярным выражениям 31.03.05 23:59  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
Потребовалось сделать следующую замену: в некоторой строке нужно заменить на что-то (к вопросу это не относится) последовательность символов типа [someclass]+ (то есть самая длинная последовательность символов какого-то класса). При этом есть условие - эта последовательность не должна заканчиваться опеределёнными символами (одним или нескольким) из этого класса.

Например, если класс [qwerty], запрещённые символы [et], замена идёт на 'something', то из строки 'ajkwyeuw' я должен получить 'ajksomethinguw'. Как это сделать ума не приложу. Можно, конечно, написать подпрограмму, которая будет заниматься поиском по "стандартным" алгоритмам, но хотелось бы обойтись малой кровью, т. е. регулярными выражениями (важное условие - максимум одним, не считая (?...), т. к. там есть ещё не относящиеся к теме нюансы).

Заранее благодарен.
[Perl] Я немного не понял 01.04.05 16:57  
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
<"чистая" ссылка>
> Например, если класс [qwerty], запрещённые символы [et],
> замена идёт на 'something', то из строки 'ajkwyeuw' я
> должен получить 'ajksomethinguw'. Как это сделать ума не
> приложу. Можно, конечно, написать подпрограмму, которая
> будет заниматься поиском по "стандартным" алгоритмам, но
> хотелось бы обойтись малой кровью, т. е. регулярными
> выражениями (важное условие - максимум одним, не считая
> (?...), т. к. там есть ещё не относящиеся к теме нюансы).

в этом случае ты должен получить вроде бы ajksomethingeuw -ведь самая длинная разрешенная последовательность - wy

анивей - вот например так:
perl -e '$x="ajkwyeuw" ; $x=~s/[qwerty]+([^et])/something$1/g ; print "$x \n";'
ajksomethinguw

уж не знаю насколько это будет верно в остальных случаях. :)
Да, это я уже сам в примере напутал. Именно так. 01.04.05 23:12  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
> в этом случае ты должен получить вроде бы ajksomethingeuw
> -ведь самая длинная разрешенная последовательность - wy
Да, это я уже сам в примере напутал. Именно так.

> анивей - вот например так:
> perl -e '$x="ajkwyeuw" ;
> $x=~s/[qwerty]+([^et])/something$1/g ; print "$x \n";'
> ajksomethinguw
>
> уж не знаю насколько это будет верно в остальных случаях.
> :)
Заработало :) Спасибо. Только строка поиска должна быть /[qwerty]+([^et]*)/, т. к. он не должен учитывать все конечные символы из этого класса. Но тут я уже разобрался :)
Ещё способ придумал (что бы для полноты картины) 02.04.05 05:00  
Автор: Heller <Heller> Статус: Elderman
Отредактировано 02.04.05 05:06  Количество правок: 1
<"чистая" ссылка>
$temp=~s/[qwerty]+/$t=$&;$t=~s#[et]*$##;"something$&"/e;
В общем-то немного более запутано, но зато нет постоянных возвратов [qwerty]+ c целью поиска наибольшего [et]*.

Заодно ещё вопрос возник. Регулярные выражения ведь ведут поиск слева направо. А если используется $ как символ физического конца строки? Всё равно? Или уже наоборот?
Зависит от реализации? 03.04.05 17:09  
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
<"чистая" ссылка>
вобщем man perlre
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2021 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach