标记字符串中的项目列表,不重叠

时间:2015-05-28 07:14:10

标签: perl text-processing

我有一个文字样本:

my $text = 'a bb cc xx aa a b c a';

以及文本中可能包含的术语列表:

my @words = ('bb cc',
    'a bb cc',
    'xx aa a b',
    'a b',
    'a'
);

我需要找到这些单词的出现次数,使用尽可能长的匹配,而不是标记任何两次。因此,如果我在上面的文本中标记了匹配项,它将如下所示:

<a bb cc> <xx aa a b> c <a>

请注意,我没有标记bb cc,因为这是较大匹配a bb cc的一部分。

有关方法的任何想法吗?我觉得以前应该多次遇到过。

1 个答案:

答案 0 :(得分:2)

应该进行简单的替换,你必须按长度排序:

my $re = '('.join('|', sort {length $b <=> length $a} map(quotemeta,@words)).')';
$text =~ s/$re/<$1>/g;
say $text;

5.20.2的预期输出,现在无法检查其他版本。 您提供的示例实际上并不需要quotemeta部分,它可以在regexen中转义具有特殊含义的字符。