我正在尝试用位于其他两个部分之间的子字符串替换字符串。
为了描述,我有一个文件,其中包含一些文本。在此文本文件中,有一个单词,其中某些部分用不同的字符书写,例如:
acc\E34rate
acc\?4rate
acc§54rate
.....
我想作为代码写的是先查找acc
,然后查找rate
,然后用u
替换它们之间的内容。因为所有字符串都与第一部分和最后一部分相同。
我想知道如何在Perl中做到这一点?
谢谢!
更新:包括代码
我写的是:
use strict;
use warnings;
my @stringArray = ('acc\E34rate', 'acc\?4rate');
my $find = '\E34';
my $replace = 'u';
my @newArray;
foreach my $str(@stringArray)
{
my $pos = index($str, $find);
while($pos > -1) {
substr($str, $pos, length($find), $replace);
$pos = index($str, $find, $pos + length($replace));
}
push @newSrray, $str;
}
foreach(@newArray)
{
print "$_\r\n";
}
为简化起见,我添加了一个数组而不是一个文件。因为它仅适用于适当的单词,而不适用于整个数组/文件。
答案 0 :(得分:1)
尝试一下:
$Text = "acc\E34rate
acc\?4rate
acc§54rate"; # This is the joined string (using enter key) after reading from the file
$Text =~ s/^acc.*?rate$/accutext/mg;
print $Text;
我刚刚在系统中对其进行了测试,并且工作正常。
输出:
文字
文字
文字
m
表示该字符串是多行字符串,每个\n
将被视为字符串字符的结尾。
g
将替换所有可能出现的情况。
要以数组形式返回,请使用\n
进行拆分。
请注意,以上代码是基于以下假设编写的:文件中的每一行分别以acc和text开头和结尾,并且该行之后或之前没有其他文本(即File not具有像"Driving acc\?4rate at 60kmph" and only "acc\?4rate"
这样的单独行。
如果该单词在句子中的单词之间,请替换下面的代码。
$Text =~ s/acc.*?rate/accutext/g;
顺便说一句,这也适用于所有可能的输入,包括顶部的代码。
答案 1 :(得分:1)
我认为这是您想要的,但要求不清楚。有关更多详细信息,请参见perldoc perlre
。
#!/usr/bin/env perl
use strict;
use warnings;
my $begin = 'acc';
my $end = 'rate';
my $replace = 'u';
while( my $line = <DATA> ){
$line =~ s{ \Q$begin\E \S*? \Q$end\E }{$begin$replace$end}gmsx;
print $line;
}
__DATA__
acc\E34rate
acc\?4rate
acc§54rate
acc\E34rate acc\?4rate acc§54rate
accFOOacc
rateFOOrate
rateFOOrate accFOOacc
accFOOacc rateFOOrate