【问题标题】:Regex to match all permutations of {1,2,3,4} without repetition正则表达式匹配 {1,2,3,4} 的所有排列而不重复
【发布时间】:2011-03-07 07:02:54
【问题描述】:

我正在用 ruby​​ 实现以下问题。

这是我想要的模式:

1234、1324、1432、1423、2341 等

即四位数字中的数字应在[1-4]之间,并且也应不重复。

为了让您以简单的方式理解,我采用两位数模式 解决方案应该是: 12、21

即数字应为 1 或 2,且不应重复。

为了确保它们不重复,我想使用 $1 作为我的第二个数字的条件,但它不起作用。

请帮助我并提前感谢。

【问题讨论】:

  • 没有正则表达式:str.chars.sort.join == "1234"

标签: regex permutation lookahead negative-lookahead


【解决方案1】:

你可以使用这个(see on rubular.com):

^(?=[1-4]{4}$)(?!.*(.).*\1).*$

第一个断言确保它是^[1-4]{4}$,第二个断言是一个否定的前瞻,确保你不能匹配.*(.).*\1,即重复的字符。第一个断言是“更便宜”,所以你想先这样做。

参考文献

相关问题

【讨论】:

  • +1 ** 第一个断言是“更便宜”,所以你想先这样做。 **
【解决方案2】:

只是为了一笑而过,这是另一种选择:

^(?:1()|2()|3()|4()){4}\1\2\3\4$

随着每个唯一字符的使用,其后的捕获组会捕获一个空字符串。反向引用也尝试匹配空字符串,因此如果其中一个不成功,则只能表示关联的组没有参与匹配。只有当字符串包含至少一个重复项时才会发生这种情况。

这种空捕获组和反向引用的行为在任何正则表达式风格中都不受官方支持,因此告诫 emptor。但它在大多数情况下都有效,包括 Ruby。

【讨论】:

  • 我将此表达式复制并粘贴到 gskinner.com/RegExr 并尝试了文本 1244,它匹配它。它不能防止重复。
  • @gsingh2011:RegExr 是一个 Flash 应用程序,这意味着它使用 ActionScript 风格。并且 ActionScript 实现了 ECMAScript 标准,该标准规定对尚未参与匹配的组的反向引用总是成功的,无论该组应该匹配什么。请参阅here 进行讨论。这个噱头在 JavaScript 或 VBScript 中也不起作用,如果您指定 ECMAScript 选项,它在 .NET 中也不起作用,但在其他情况下它会起作用。
  • 感谢您的澄清。这很有趣。
【解决方案3】:

我觉得这个解决方案有点简单

^(?:([1-4])(?!.*\1)){4}$

here on Rubular

^                  # matches the start of the string
    (?:            # open a non capturing group 
        ([1-4])    # The characters that are allowed the found char is captured in group 1
        (?!.*\1)   # That character is matched only if it does not occur once more
    ){4}           # Defines the amount of characters
$

(?!.*\1)lookahead assertion,保证字符不重复。

^$ 是匹配字符串开头和结尾的锚。

【讨论】:

    【解决方案4】:

    虽然前面的答案解决了问题,但它们并没有尽可能通用,并且不允许在初始字符串中重复。例如,{a,a,b,b,c,c}。在Perl Monks 上询问similar question 后,the following solutionEily 给出:

    ^(?:(?!\1)a()|(?!\2)a()|(?!\3)b()|(?!\4)b()|(?!\5)c()|(?!\6)c()){6}$
    

    同样,这适用于字符串中较长的“符号”,也适用于可变长度的符号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 2013-12-30
      • 2015-12-26
      相关资源
      最近更新 更多