正则表达式匹配{1,2,3,4}的所有排列而不重复

时间:2010-06-23 12:01:58

标签: regex permutation lookahead negative-lookahead

我在ruby中实现了以下问题。

这是我想要的模式:

1234,1324,1432,1423,2341等

即。四位数字中的数字应该在[1-4]之间,也应该是非重复的。

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

即。数字应该是1或2,并且应该是非重复的。

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

请提前帮助我,并提前致谢。

4 个答案:

答案 0 :(得分:22)

您可以使用此(see on rubular.com):

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

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

参考

相关问题

答案 1 :(得分:11)

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

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

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

任何正则表达式都没有正式支持空捕获组和反向引用的这种行为,因此 caveat emptor 。但它适用于大多数,包括Ruby。

答案 2 :(得分:5)

我认为这个解决方案有点简单

^(?:([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,以确保不再重复该字符。

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

答案 3 :(得分:0)

尽管前面的答案解决了问题,但它们并没有尽可能的通用,并且不允许在初始字符串中重复。例如,viewWillDisappear(_ animated: Bool)。在similar question上询问Perl Monks后,the following solution给出了Eily

{a,a,b,b,c,c}

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