:: urbansheep (urbansheep) wrote,
:: urbansheep
urbansheep

  • Music:

[ utx ] Как организовать проверку строки и применение фильтров?

Есть некая строка, например:

http://www.livejournal.com/users/urbansheep/841416.html?mode=reply

Есть некоторый набор ре (регулярных выражений) в массиве, через которые надо каким-то образом провести эту строку. При этом ре должны служить и для match и для replace. В итоге должна получиться строка, которая идентифицирована, как (например) „соответствующая ре 4, применён заменяющий ре 4.1“.

Exo: Почему не взять обычный цикл, ведь тогда достаточно будет проматчить строку на каждый ре (что и нужно сделать)?

Ubs: Потому что:

  1. Хочется максимально сократить время выполнения — после первого же попадания обычно цикл надо прекращать (подожди, не перебивай)
  2. Нужно где-то хранить и match и replace — двумерный массив?
  3. Ещё была мысль какая-то, а ты её спугнула.

Exo: Погоди, ты, кажется, чего-то недопонимэ. Смотри:

  1. Просто в цикле запускай replace, потом сравнивай строку-оригинал со строкой-результатом. Если неодинаковые, выходи из цикла по break. Как вариант — попробуй при входе в цикл передавать конкретный match на результат. Условно говоря, если тебе на выходе нужно [a-z]+\|[0-9]+, то и искать нужно именно эту строку, а не просто обнаруживать изменение входной строки.
  2. Тебе не нужно хранить и то и другое. Как я понимаю, тебе достаточно хранить match, который будет использован в replace — ведь они идентичны, в противном случае — это двухступенчатая обработка, о которой ты ничего не говорила. В любом случае, это можно сделать вложенными циклами — только отследи выходы и условия, чтобы не случилось вечных циклов.

Exo: Дальше, тебе нужно обнаруживать, каким именно фильтром была сделана замена — это ещё проще. Просто в каждом обороте сохраняй номер текущего оборота цикла, так что потом у тебя на выходе будет: 1) строка, соответствующая заданному match (да, ты можешь хранить выходной match в параллельном массиве, кстати); 2) номер круга, соответствующий индексу ре, которое отработало.

Ubs: Хм. Да, разумно. Я попробую, спасибо. А ты не говорила, что и в программной логике что-то смыслишь. Я как-то привыкла считать тебя чем-то вроде „секретарши Леночки“.

Exo: Спасибо, я тебя тоже люблю. С тобой чему только не научишься в жизни.

Спасибо tobe за тренировку в задавании вопросов. Да и вообще.

Subscribe
  • Post a new comment

    Error

    Comments allowed for friends only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments