我有以下字符串:
猫狗狐狸熊狡猾
我需要将此句中的“cat”和“fox”单词替换为单词“animal”
我执行以下操作:
$Str1="cat";
$Str2="fox";
$NewStr="animal";
open(F1, "<$inputFile") or die "Error: $!";
open(F2, ">$outputFile") or die "Error: $!";
while ($line = <F1>) {
$line =~ s/$Str1|$Str2/NewStr/g;
print F2 "$line";
}
但是这个词的“catepillar”和“foxy”部分(“cat”和fox)的问题也被替换了。 如何只替换单词“cat”和“fox”?
答案 0 :(得分:3)
$line =~ s/\b(?:$Str1|$Str2)\b/$NewStr/g;
这些变化意味着什么:
\b
字边界的零宽度断言
(?:
启动一个群组,但不要将其用于捕获,只是分组
答案 1 :(得分:3)
这里还有一些问题。
# First, always use strict and warnings
# This will save you tons
use warnings;
use strict;
# declare your vars with 'my' for lexical scope
my $inputFile = "somefile";
my $outputFile = "someotherfile";
my $Str1="cat";
my $Str2="fox";
my $NewStr="animal";
# use 3-arg lexically scoped open
open(my $F1, "<", $inputFile) or die "Error: $!";
open(my $F2, ">", $outputFile) or die "Error: $!";
while (my $line = <$F1>) {
# surround with word boundary '\b'
# NewStr is missing the "$"
$line =~ s/\b(?:$Str1|$Str2)\b/$NewStr/g;
# UPDATED
# this should work to remove the parens
$line =~ s/(\($NewStr\))/$NewStr/g;
print $F2 "$line";
}
# close your file handles
close $F1;
close $F2;
答案 2 :(得分:0)
使用单词边界断言来构建正则表达式。您可以在http://perldoc.perl.org/perlre.html找到相关信息。