Программирование > Perl
Рег. выражения. Несовсем простая замена слов.
			sd1074:
			
			Вот возникла такая задача: надо написать регулярное выражение для замены в заданной строке слов: "слово1", "слово2", "слово3" на "слово2", "слово3", "слово4" соответсвенно. В чём хитрость? 
Например вариант:
$str=~s/слово1/слово2/g;
$str=~s/слово2/слово3/g;
$str=~s/слово3/слово4/g;
не пододит, т.к. из строки "слово1 слово2 слово3" он сделает "слово3 слово3 слово4", а должен "слово2 слово3 слово4". 
То есть нужно сделать как-то, чтобы регулярное выражение, найдя один из образцов, заменило его и повторно уже эта часть строки не подвергалась обработке. Конечно, можно сделать цикл, но хотелось бы как-то написать это одним регулярным выражением. Что-то типа:
$str=~s/слово1|слово2|слово3/слово2|слово3|слово4/g;
Последний вариант синтаксически неверен к сожалению.
		
			arto:
			
			DB $a = "test word1 word2 word3 test"
  DB $a =~ s|word1 word2 word3|word2 word3 word4|g 
  DB p $a
test word2 word3 word4 test
		
			sd1074:
			
			нене! так не катит. Исходня строка имеет произволный формат.
например, исходнаястрока:
 "Is this word3, or word1? No! This is word2! ";
должна быть преобразована в:
"Is this word4, or word2? No! This is word3! ";
Твой вариант здесь явно не проходит.
В том то и дело же не всё так просто как кажется на первый взгляд. По-моему :)
		
			arto:
			
			DB $a = "Is this word3, or word1? No! This is word2! "
  DB $a =~ s|word3|word4|g; $a =~ s|word2|word3|g; $a =~ s|word1|word2|g;
  DB p $a
Is this word4, or word2? No! This is word3!
		
			sd1074:
			
			И это не есть панацея.
В частности мы можем хотеть заменить в тексте слова "word1", "word2" на "word2", "word1" соответсвенно. Или, проще гвооря, поменять их местами. 
Но нет необходимости здесь приводить пример позволяющий поменять два слова в тексте местами. Он мне понятен.
Задача стоит более общая. Сейчас попробую чётко сформулировать.
Необходимо разработать программную схему для замены в строке слов: "word1", word2", "word3"... и т.д.  на "wordA", "wordB", "wordC" и т.д. соответсвенно. При этом некоторые написания слов из первой совокупности могут совпадать с какими-то напсианиями слов второй совокупности. 
Задача в принципе не сложно решается с использованием цикла, но неужели её нельзя решить с помощью регулярного выражения?! 
Для отдельных букв можно было бы использовать транслитерацию tr///g, но мы имеем целые слова.
		
Навигация
Перейти к полной версии