Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > найти foo но не "...foo..."


Автор: GoldFinch 13.5.2010, 14:21
как должна выглядеть регулярка для следующей замены:
входная строка:
 ___foo___"__foo__"___
результат замены
 ___bar___"__foo__"___

т.е. если часть строки заключена в "", то в ней замена не производится

Автор: dva300 19.5.2010, 00:38
Цитата(GoldFinch @ 13.5.2010,  14:21)
как должна выглядеть регулярка для следующей замены:
входная строка:
 ___foo___"__foo__"___
результат замены
 ___bar___"__foo__"___

т.е. если часть строки заключена в "", то в ней замена не производится

день добрый, 
можно так 

Код

use strict;
my $str='sdfsdfsdf foo sdfsdfsfsdf "sdsfsdf for sdfsdf" sfsdfsdfsdf foo sdfsfsdff';
$str =~ s/([^\"].*?)foo([^\"].*?)/\1BAR\2/gi;
print $str;


итог 

sdfsdfsdf BAR sdfsdfsfsdf "sdsfsdf for sdfsdf" sfsdfsdfsdf BAR sdfsfsdff


Автор: GoldFinch 19.5.2010, 18:35
dva300, вы ошиблись и написали в кавычках не foo а for.

Автор: dva300 19.5.2010, 18:50
Цитата(GoldFinch @ 19.5.2010,  18:35)
dva300, вы ошиблись и написали в кавычках не foo а for.

да, согласен, прошу прощения.

частный случай когда "foo"
Код


use strict;
my $str='sdfsdfsdf foo sdfsdfsfsdf "foo" sfsdfsdfsdf foo sdfsfsdff';
$str =~ s/[^\"]foo[^\"]/BAR/gi;
print $str;


остается воткнуть произвольные способы.
вечером подумаю.
 

Автор: GoldFinch 20.5.2010, 18:31
dva300, в реальном случае, мне кроме кавычек надо будет еще пропускать /*..\n..*/ и //....\n

пока что я решил что регуляркой такое не сделать,
надо искать (foo|".*?foo.*?") и проверять 1й символ найденного

Автор: amg 21.5.2010, 15:26
Цитата(GoldFinch @  20.5.2010,  18:31 Найти цитируемый пост)
и проверять 1й символ найденного
 smile 
$str = join '', map {/^"/ || s/foo/bar/g; $_} split /(".*?")/, $str;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)