我需要找到一种方法来检查是否存在{1,2,3,4,5,6,8,9,10}
类型的集合,这些集合有一个预设的元素数。另外,注意缺少的7
。显然,数字可以是任意顺序的,应该只出现一次,因为根据定义,{1,2,3} = {3,2,1} = {1,2,3,3} = ...
等等。
我如何才能用Perl (或者甚至可能)做到这一点?我尝试过的一件事是{([1-6],|[8-9],|10,){8}([1-6]|[8-9]|10)}
这里,但这并不能处理括号内相同数字的多个实例。
发布于 2018-07-13 17:27:35
这个大王就是这么做的。
这里分配了10个插槽,但您可以添加任意数量(100?)。
这并不意味着你必须在一组中匹配10个唯一的数字,
您可以匹配小于或等于10的任何内容(例如{5}
),
甚至是像{3,7}
这样的范围
这些插槽将从1开始按顺序填充。
所以,你只需要坐在一个从1-N循环,看看它是否被定义。
如果你在寻找速度,这就是你想要的恶魔!
/\{(?>(?>(?(1)(?!))((?&GetNum))|(?(2)(?!))((?&GetNum))|(?(3)(?!))((?&GetNum))|(?(4)(?!))((?&GetNum))|(?(5)(?!))((?&GetNum))|(?(6)(?!))((?&GetNum))|(?(7)(?!))((?&GetNum))|(?(8)(?!))((?&GetNum))|(?(9)(?!))((?&GetNum))|(?(10)(?!))((?&GetNum)))(?:,(?!\})|(?=\}))){3,7}\}(?(DEFINE)(?<GetNum>(?!(?:\g{1}|\g{2}|\g{3}|\g{4}|\g{5}|\g{6}|\g{7}|\g{8}|\g{9}|\g{10})\b)\d+))/
https://regex101.com/r/pPwPTe/1
可读性正则表达式
# Unique numbers in set, 10 slots
\{
(?> # Atomic, no backtracking allowed
(?> # ditto
(?(1) (?!) ) ( (?&GetNum) ) # (1), Slot 1
| (?(2) (?!) ) ( (?&GetNum) ) # (2), Slot 2
| (?(3) (?!) ) ( (?&GetNum) ) # (3), Slot 3
| (?(4) (?!) ) ( (?&GetNum) ) # (4), Slot 4
| (?(5) (?!) ) ( (?&GetNum) ) # (5), Slot 5
| (?(6) (?!) ) ( (?&GetNum) ) # (6), Slot 6
| (?(7) (?!) ) ( (?&GetNum) ) # (7), Slot 7
| (?(8) (?!) ) ( (?&GetNum) ) # (8), Slot 8
| (?(9) (?!) ) ( (?&GetNum) ) # (9), Slot 9
| (?(10) (?!) ) ( (?&GetNum) ) # (10), Slot 10
)
(?: , (?! \} ) | (?= \} ) )
){3,7} # Set range, example: 3 to 7 unique numbers in set
\}
(?(DEFINE)
(?<GetNum> # (4) Get a new number, must not be seen before
(?! (?: \g{1}|\g{2}|\g{3}|\g{4}|\g{5}|\g{6}|\g{7}|\g{8}|\g{9}|\g{10} ) \b )
\d+
)
)
发布于 2018-07-13 14:49:14
Regexes在这里几乎肯定是错误的工具。您需要处理输入列表的排列的东西。
这篇博客文章对处理排列和组合的Perl模块提供了有用的概述。在我看来,算法:组合学是个很好的起点。也许是这样的:
use Algorithm::Combinatorics;
my @input = qw[1 2 3 4 5 6 8 9 10];
my @perms = permutations(\@input);
然后,您需要一些方法来比较有效的排列和要测试的集合。我会考虑构造集合的字符串表示(通过使用已知的分隔符将它们连接起来)并进行简单的字符串比较。
my @perm_strs = map { join ':' } @perms;
my @test = qw[2 4 3 1 10 5 9 8 6];
my $test_str = join ':', @test;
my $match = 0;
for (@perm_strs) {
if ($test_str eq $_) {
$match = 1;
last;
}
}
这场比赛的成功现在在$match
。
https://stackoverflow.com/questions/51327214
复制相似问题