首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >匹配{1,2,3,4}的所有排列而不重复的正则表达式

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

Stack Overflow用户
提问于 2010-06-23 20:01:58
回答 4查看 9.8K关注 0票数 12

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

下面是我想要的模式:

1234、1324、1432、1423、2341等等

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

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

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

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

请帮帮我,提前谢谢你。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-23 20:04:53

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

代码语言:javascript
复制
^(?=[1-4]{4}$)(?!.*(.).*\1).*$

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

参考文献

  • regular-expressions.info/LookaroundsBackreferences

相关问题

票数 24
EN

Stack Overflow用户

发布于 2010-06-23 21:49:36

只是为了开怀大笑,这里有另一个选择:

代码语言:javascript
复制
^(?:1()|2()|3()|4()){4}\1\2\3\4$

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

这种空捕获组和反向引用的行为在任何regex版本中都不受官方支持,因此请注意抢购者。但它在大多数情况下都能正常工作,包括Ruby。

票数 12
EN

Stack Overflow用户

发布于 2013-01-25 15:00:46

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

代码语言:javascript
复制
^(?:([1-4])(?!.*\1)){4}$

查看here on Rubular

代码语言:javascript
复制
^                  # 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,以确保字符不会重复。

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

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

https://stackoverflow.com/questions/3101366

复制
相关文章

相似问题

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