Программирование > Perl
Рег. выражения. Несовсем простая замена слов.
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
Проверь личные сообщения!
Кое-что отписал тебе.
Навигация
Перейти к полной версии