![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
На одном из форумов наткнулся на такую задачку:
есть строка, допустим $s = ' 2 3 4 5 6 78 9'; Нужно получить $s = 'nbsp;nbsp;nbsp;nbsp;2 3 4 5 6 78 9'; Поначалу показалось, что это очень легко. Но не тут то было! Конечно, решается с использованием цикла либо
А вот можно ли сделать это просто одним регулярным выражением, без циклов и опции /e? |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
думаю нет. "регулярка" не повторяет поиск/замену с начала текста/строки... (если есть повтор - тогда да, не нашел повтор... надо маны подымать
![]() Добавлено через 12 минут и 20 секунд даже с заглядыванием назад не выйдет... не знаю (плохо читал теорию ;) ), но я так понял: в памяти исходная, по которой меняет, и получаемая..., т.е. если бы было иначе, то можно было примерно так /(^\s|(?<=;)\s)// |
|||
|
||||
Nab |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Интересная задачка однако
![]() и вот верное решение ![]()
объяснить не смогу, сам понимаю подсознанием, дошел методом научного тыка ![]() -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
nitr |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Nab, ну вот так и знал =)))
\G всему решение =) Добавлено через 7 минут и 45 секунд но честно, и такое работает ![]()
Добавлено через 9 минут и 47 секунд
|
||||
|
|||||
Nab |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Хитрый ты однако... а теперь попытайся объяснить народу, почему оно работает....
На пальцах, чтоб все поняли ![]() -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
\G сохраняет позицию предидущего совпадения.
|
|||
|
||||
Nab |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Дык понятно ![]() А как оно в конкретном случае то работает? Распиши плиз... Я тяжело пришел к этому варианту, у меня раньше никогда с \G не получалось... теперь я знаю что не правильно понимал его работу, но при этом ясности в этом вопросе у меня все одно нет... :( Кто бы разжевал поподробнее.... ![]() -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Господа! Снимаю шляпу!
Про \G я тоже думал, приходилось сталкиваться (нужно было по образцу сделать регулярное выражение для похожих на образец строк), но почему то считал, что \G можно использовать только внутри цикла. Еще я рад, что интуиция меня не обманула: задача действительно имеет решение. |
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Я так понимаю принцип работы такой регулярки:
Утверждение \G запоминает позицию следующую за предидущим найденным соответствием, в нашем случае это 1 пробел. Далее из-за модификатора g циклически идём по строке, символ за символом. Если в сохранённой, утверждением \G, позиции символ совпадает с шаблоном \s значит делаем замену, в противном случае поиск завершается. Вобщем при поиске каждого последующего символа пробела, мы утверждаем что в следующей позиции будет именно пробел, а не какй-нить другой символ. Если это не так, то поиск завершается, если да, то происходит замена. Именно потому, что мы утверждаем, машина регулярных веражений, завершает свою работу, вместо того, что бы продолжить поиск в следующей позиции, так как установлен модификатор g. ЗЫ: Это моё мнение, возможно оно и не верное. В книгах и документации как-то мутно описана эта тема. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
korob2001, думаю самое нормальное описание и я тоже с ним соглашусь, даже если перевести из дока, то получим некий "замут", но попрактиковаться и более менее ясно, но согласен, задача была хорошей
![]() |
|||
|
||||
Nab |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
korob2001, да неплохо сказал
![]() Посмотреть его можно функцией pos, и даже изменить можно, чтобы поиск продолжался с другой позиции... Так что не все так просто, как хотелось бы ![]() -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Привожу цитату из книги "Программирование на Perl" авторов перечислять не буду и так все поняли о какой книге идёт речь. Стр. 224 (последний абзац).
Короче позиция которая находится, непосредственно за последним найденым соответствием. Т.е. следующим будет найден тот символ который следует за предидущим. Позиция же указывается непосредственно между пред идущим и следующим символом. Добавлено через 6 минут и 46 секунд А вопрос был действительно очень интересный. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |