Программирование > Perl

Рег. выражения. Несовсем простая замена слов.

<< < (2/2)

arto:
DB $a = "Is this word3, or word1? No! This is word2! "

  DB %hash = (\'word1\' => "word2",\'word2\' => "word3",\'word3\' => "word4")

  DB $re = sprintf "(%s)",join "|",keys %hash

  DB $a =~ s#$re(?!\\000)#$hash{$1}\\000#g

  DB $a =~ s#\\000##g

  DB p $a
Is this word4, or word2? No! This is word3!
  DB

sd1074:
Спасибо, хорошее решение. Я сейчас сам поищу, но если вас не затруднит, не могли бы Вы написать пару слов про махинации с \\000. Не совсем понял.

arto:
маркируем замененные слова, чтобы их два раза не менять.
во второй раз удаляем маркеры.
\\000 выбран за редкой встречаемостью в строках.

sd1074:
Ваш метод тем и хорош, что маркеровать не нужно. И ещё я чуток добавил коррекцию на имена первой совокупности.
   my %hash = (
      \'word1\' => "wordA",
      \'word2\'  => "wordB",
      \'word3\'  => "wordC",
   );
   $re = join "|",keys %hash;
   $re=~s/\\\\/\\\\\\\\/g;      #Здесь учтём, что слова первой совокупности могут содержать обратный слэш!
   $txt =~ s/($re)/$hash{$1}/g;
Вроде отлично работает. Спасибо вам.

nal:
sd1074
Проверь личные сообщения!
Кое-что отписал тебе.

Навигация

[0] Главная страница сообщений

[*] Предыдущая страница

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 
Перейти к полной версии