代码之家  ›  专栏  ›  技术社区  ›  Apoorv Saxena

regex匹配1,2,3,4的所有排列,不重复

  •  10
  • Apoorv Saxena  · 技术社区  · 14 年前

    我正在Ruby中实现以下问题。

    我想要的模式是:

    1234、1324、1432、1423、2341等

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

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

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

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

    请帮帮我,提前谢谢。

    4 回复  |  直到 6 年前
        1
  •  22
  •   Community Sam Holder    7 年前

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

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

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

    工具书类

    相关问题

        2
  •  11
  •   Alan Moore Chris Ballance    14 年前

    只是为了咯咯笑,这里还有另一个选择:

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

    As each unique character is consumed, the capturing group following it captures an empty string. backreferences还尝试匹配空字符串,因此如果其中一个不成功,则只能表示关联的组没有参与匹配。只有当字符串包含至少一个重复项时才会发生这种情况。

    这种空捕获组和backreference的行为在任何regex风格中都不受正式支持,因此 买者弃权 . 但它在大多数情况下都有效,包括Ruby。

        3
  •  5
  •   stema Arun Mohan    12 年前

    我觉得这个方法简单一点

    ^(?:([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
  •  0
  •   Quantum Mechanic    6 年前

    虽然前面的答案解决了这个问题,但它们并不像以前那样通用,而且不允许在初始字符串中重复。例如, {a,a,b,b,c,c} . 问过 similar question Perl Monks , the following solution 是由 Eily :

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

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

    推荐文章