将字符串拆分为某些部分,然后将一个子字符串替换为另一字符串

时间:2018-07-03 08:21:02

标签: arrays string perl substring

我正在尝试用位于其他两个部分之间的子字符串替换字符串。

为了描述,我有一个文件,其中包含一些文本。在此文本文件中,有一个单词,其中某些部分用不同的字符书写,例如:

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";
    }

为简化起见,我添加了一个数组而不是一个文件。因为它仅适用于适当的单词,而不适用于整个数组/文件。

2 个答案:

答案 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