Apo*_*ena 10 regex permutation lookahead negative-lookahead
我在ruby中实现了以下问题.
这是我想要的模式:
1234,1324,1432,1423,2341等
即四位数字中的数字应该在[1-4]之间,也应该是非重复的.
为了让你以一种简单的方式理解我采取两位数模式,解决方案应该是:12,21
即数字应为1或2,并且应该是非重复的.
为了确保它们不重复,我想使用$ 1作为我的第二个数字的条件,但它不起作用.
请帮助我,并提前感谢.
pol*_*nts 22
你可以使用它(参见rubular.com):
^(?=[1-4]{4}$)(?!.*(.).*\1).*$
Run Code Online (Sandbox Code Playgroud)
第一个断言确保它是^[1-4]{4}$,第二个断言是负向前瞻,确保你不能匹配.*(.).*\1,即重复的字符.第一个断言是"更便宜",所以你想先做.
Ala*_*ore 11
只是为了咯咯笑,这是另一种选择:
^(?:1()|2()|3()|4()){4}\1\2\3\4$
Run Code Online (Sandbox Code Playgroud)
当消耗每个唯一字符时,其后面的捕获组捕获空字符串.反向引用也尝试匹配空字符串,因此如果其中一个不成功,则只能表示关联组未参与匹配.只有当字符串包含至少一个副本时才会发生这种情况.
空捕获组和反向引用的这种行为在任何正则表达式都没有正式支持,因此需要注意.但它适用于大多数,包括Ruby.
我认为这个解决方案有点简单
^(?:([1-4])(?!.*\1)){4}$
Run Code Online (Sandbox Code Playgroud)
在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
$
Run Code Online (Sandbox Code Playgroud)
(?!.*\1)是一个先行断言,以确保不重复的性格.
^并且$是锚点以匹配字符串的开头和结尾.