当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《正则表达式匹配{1,2,3,4}的所有排列而不重复》经验,为你挑选了3个好方法。

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

这是我想要的模式:

1234,1324,1432,1423,2341等

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

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

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

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

请帮助我,并提前感谢.



1> polygenelubr..:

你可以使用它(参见rubular.com):

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

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

参考

regular-expressions.info/Lookarounds和反向引用

相关问题

正则表达式如何(?<=#)[^#]+(?=#)工作?


+1**第一个断言是"更便宜",所以你想先做.**

2> Alan Moore..:

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

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

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

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


**咯咯笑**
@ gsingh2011:RegExr是一个Flash应用程序,这意味着它使用ActionScript风格.ActionScript实现了ECMAScript标准,该标准规定,对于尚未参与匹配的组的反向引用总是成功,无论该组应该匹配什么.有关讨论,请参阅[此处](http://blog.stevenlevithan.com/archives/fixing-javascript-regexp).这个噱头在JavaScript或VBScript中也不起作用,如果指定`ECMAScript`选项,它在.NET中不起作用,尽管它没有.

3> stema..:

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

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

在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)是一个先行断言,以确保不重复的性格.

^并且$是锚点以匹配字符串的开头和结尾.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有