【发布时间】:2015-08-10 13:15:16
【问题描述】:
我有一个文本示例:
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 的一部分。
关于如何做到这一点的任何想法?感觉应该已经遇到过很多次了。
【问题讨论】:
-
您可以将
@words与$text 进行比较,然后过滤掉剩余的重叠@words元素。 -
你想找到一个好的算法来找到一个解决方案,还是一个只适用于正则表达式引擎的解决方案?另外,你如何计算最长的匹配?考虑您必须在
acab中找到字符串ab、ac和cab:使用<ac><ab>,您会找到匹配总和最长的解决方案,而使用a<cab>您会找到了一个最先应用最长匹配的。 -
@PatrickJ.S.最长的匹配是a
。我想领带可能会按字母顺序断开。我想我想要最简单的解决方案,但欢迎所有解决方案。
标签: perl text-processing