我有一个(非常)长的数字字符串列表,我需要计算某些值的出现次数,以便决定是否拉出与字符串关联的行。本质上,该文件的格式如下:
,4,8,9,11,12,
,5,6,7,9,11,
etc.
其中字符串的长度范围为 1 - 100 个值,值的范围为 1 - 100,并且字符串中的值始终按从小到大的顺序排列。
我试图找到所有的行,例如,三个值 4、9 和 11 中至少有两个,所以这是我写的测试代码来尝试我的正则表达式:
my $string = ",4,8,9,11,12,";
my $test = ",4,|,9,|,11,";
my @c = $string =~ m/$test/g;
my $count = @c;
print "count: $count\n";
print "\@c:, join(" ", @c), "\n";
我运行时的输出是:
count: 2
@c:,4, ,9,
当我期望 count 是3
并且 @c 是,4, ,9, ,11,
.
我意识到这是因为 9 和 11 共享相同的逗号,但我想知道是否有人知道如何解决这个问题。我不能只从匹配中删除最后一个逗号,因为如果我试图匹配,4
一个,41,
包含例如的字符串,它会错误地计算,41,
.
我想我可以做类似的事情:
my $test = "4|9|11";
$string =~ s/,/ /;
my @c = $string =~ m/\b($test)\b/g
这有效,但在匹配计数之前增加了另一个步骤。有没有办法在保持原始字符串不变的情况下执行匹配?
我还试图避免单独循环遍历我的匹配目标并将单个匹配计数相加,因为我试图最大限度地提高效率。我正在处理一些需要数百万次排列的非常庞大的值列表,而我目前使用循环编写脚本的方式需要几天时间才能完成。我希望通过正则表达式匹配它会更快。
谢谢