【问题标题】:split string to some parts and replace a one sub-string with another string将字符串拆分为某些部分并用另一个字符串替换一个子字符串
【发布时间】:2018-12-11 11:39:27
【问题描述】:

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

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

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

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

【问题讨论】:

  • “它的某些部分是用不同的字符写的”不是一个明确的分割标准......
  • @timgeb 好吧,我只有这个想法。如果您有更好的想法,请将其写为答案! :)
  • @Royeh:呃,这不是它的工作原理。编程从尽可能清晰地概述您的功能需求开始......此外,您似乎忘记粘贴代码。到目前为止,您尝试过什么?
  • @L.O.vanIngen 你现在可以找到我对问题和代码的更新!

标签: arrays string perl substring


【解决方案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

【讨论】:

    【解决方案2】:

    试试这个:

    $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 不是有像"Driving acc\?4rate at 60kmph" and only "acc\?4rate"这样的单独的行。
    如果这个词在句子中的词之间,请在上面的代码中替换。

    $Text =~ s/acc.*?rate/accutext/g;
    

    顺便说一句,这也适用于所有可能的输入,包括顶部的代码。

    【讨论】:

    • 否决票的任何理由?我的回答与提出的问题完全吻合!
    猜你喜欢
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多