регулярное выражение — применение к изменённой части строки
От: Гест Украина https://zverok.github.io
Дата: 25.11.09 08:20
Оценка:
Привет.
Есть регексп, к примеру:
string.gsub(/(\s)(\d)(\s)/, '\1\2^')


(читается так: если перед и после цифры идут пробелы, то первый пробел сохранить, а после — заменить на «^»)

применение:

"wtf 1 wtf.gsub(/(\s)(\d)(\s)/, '\1\2^') #=> "wtf 1^wtf"


теперь предположим, что он должен бы примениться 2 раза подряд:
'1 1 1 '.gsub(/(\s)(\d)(\s)/, '\1\2^') #=> хотелось получить '1 1^1^', а получается '1 1^1 '


очевидно, что когда регексп проверяется на второй единице, он считает, что перед ней уже не пробел, а крышка. хорошо, изменяем регексп:

'1 1 1 '.gsub(/(\s|\^)(\d)(\s)/, '\1\2^')


увы, результат не меняется (т.е. после второй единицы по-прежнему остаётся пробел).

Вопрос: у кого не едут лыжи? (варианты: 1. глючит движок регекспов в Руби, которым я пользуюсь; 2. я чего-то не понимаю про применение регекспов к уже обработанной части строки)


26.11.09 14:06: Перенесено модератором из 'Алгоритмы' — Кодт
Re: регулярное выражение — применение к изменённой части стр
От: Caracrist https://1pwd.org/
Дата: 25.11.09 09:23
Оценка: 4 (1)
Здравствуйте, Гест, Вы писали:

(/((?<=\s)\d)\s/, '\1^')

~~~~~
~lol~~
~~~ Single Password Solution
Re: регулярное выражение — применение к изменённой части стр
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 25.11.09 09:52
Оценка:
Здравствуйте, Гест, Вы писали:

Г>Вопрос: у кого не едут лыжи? (варианты: 1. глючит движок регекспов в Руби, которым я пользуюсь; 2. я чего-то не понимаю про применение регекспов к уже обработанной части строки)


С Руби не работал, но думаю, движок примерно такой же, как те, с которыми работал.
Дело в том, что когда обработалась первая замена " 1 ", поиск продолжается после этой позиции, т.е. с символа "1", следующего за (теперь уже) крышечкой, а сама крышечка осталась в обработанной части строки и возврата к ней не выполняется. Обойти это можно, поместив вызов регэкспа в цикл, крутящийся, пока выполнилась хотя бы одна замена. Ну или использовать вариант, который выше привёл Caracrist.
Почему же, ё-моё, ты нигде не пишешь «ё»?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.