Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | |
Зависит от реализации? 03.04.05 17:09 Число просмотров: 2031
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
|
вобщем man perlre
|
<programming>
|
[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
|
|
|