我有一个文字样本:
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
的一部分。
有关方法的任何想法吗?我觉得以前应该多次遇到过。
答案 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中转义具有特殊含义的字符。