分裂捕获

时间:2016-04-25 21:48:53

标签: regex perl split

我这样做:

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

有人可以提出一种简单的方法来处理$string后处理,同时保持未处理的部分完整吗? 或split不是去这里的方式?

3 个答案:

答案 0 :(得分:1)

您需要在分隔符周围使用捕获组,以将分隔符保留在结果数组中。然后使用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是奇数还是偶数)。

答案 1 :(得分: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 :(得分:0)

不太确定你的意思是“在拆分后将字符串写回”,但可能是这样的:

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

......可以解决这个问题吗?