1

我有以下字符串:

猫 狗 狐狸 毛毛虫 熊 狡猾

我需要将这句话中的“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";

}

但是单词的“毛毛虫”和“狐狸”部分(“猫”和“狐狸”)也被替换了的问题。如何仅替换单词“cat”和“fox”?

4

3 回答 3

3
$line =~ s/\b(?:$Str1|$Str2)\b/$NewStr/g;

这些变化意味着什么:

\b字边界的零宽度断言

(?:开始一个组,但不用于捕获,只是分组

于 2013-05-22T16:15:26.053 回答
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;
于 2013-05-22T16:52:08.803 回答
0

使用单词边界断言来构建您的正则表达式。您可以在http://perldoc.perl.org/perlre.html找到有关它的信息。

于 2013-05-22T16:16:48.667 回答