首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Perl的RegEx查找集合的任何排列

使用Perl的RegEx查找集合的任何排列
EN

Stack Overflow用户
提问于 2018-07-13 14:16:32
回答 2查看 163关注 0票数 2

我需要找到一种方法来检查是否存在{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)} 这里,但这并不能处理括号内相同数字的多个实例。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

可读性正则表达式

代码语言:javascript
运行
复制
 # 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+
      )
 )
票数 2
EN

Stack Overflow用户

发布于 2018-07-13 14:49:14

Regexes在这里几乎肯定是错误的工具。您需要处理输入列表的排列的东西。

这篇博客文章对处理排列和组合的Perl模块提供了有用的概述。在我看来,算法:组合学是个很好的起点。也许是这样的:

代码语言:javascript
运行
复制
use Algorithm::Combinatorics;

my @input = qw[1 2 3 4 5 6 8 9 10];

my @perms = permutations(\@input);

然后,您需要一些方法来比较有效的排列和要测试的集合。我会考虑构造集合的字符串表示(通过使用已知的分隔符将它们连接起来)并进行简单的字符串比较。

代码语言:javascript
运行
复制
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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51327214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档