【问题标题】:Capture in split [duplicate]拆分捕获[重复]
【发布时间】:2016-04-25 21:48:53
【问题描述】:

我这样做:

my @words =split(/[~,;#&=\.\s\|\(\)\+\-\?\:]+/,$string);
my @processed_words = ();
foreach (@words)  {push(@processed_words,process_word($_));}

有人可以建议一种简单的方法来在处理后组合$string,同时保持未处理的部分完好无损吗? 还是split 不是这里的路?

【问题讨论】:

  • 您的意思是要将@processed_words 与原来的分隔符重新组合?

标签: regex perl split


【解决方案1】:

如果您将定界符放在捕获组中的正则表达式中,那么split 将在其结果中包含定界符——它将在单词和定界符之间交替。然后,您可以将未处理的分隔符和已处理的单词推送到结果数组中。

my @words =split(/([~,;#&=\.\s\|\(\)\+\-\?\:]+)/,$string);
my @processed_words = ();
foreach (@words)  {
    if (/[~,;#&=\.\s\|\(\)\+\-\?\:]/) { // delimiter, just copy it
        push(@processed_words, $_)
    } else { // process the word
        push(@processed_words,process_word($_));
}

【讨论】:

    【解决方案2】:

    您需要在定界符周围使用捕获组,以将定界符保留在结果数组中。然后使用for循环并检查索引是奇数还是偶数,例如(在非单词字符上拆分并使单词字符大写)

    echo 'a"b@c%d.e^f$g' | perl -ne '@a=split(/(\W+)/);for($i=0;$i<@a;++$i){ print $i%2 ? @a[$i] : uc@a[$i];}'
    

    (其中$i%2 检查索引$i 是奇数还是偶数)。

    【讨论】:

      【解决方案3】:

      不太清楚你所说的“在拆分后组合 $string”是什么意思,但可能是这样的:

      my $composed = join(" ", map { process_word($_) } @words);
      

      ...会成功吗?

      【讨论】:

      猜你喜欢
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 2018-08-09
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多