Regex 正则表达式匹配{1,2,3,4}的所有置换而不重复
我正在ruby中实现以下问题 以下是我想要的模式: 1234、1324、1432、1423、2341等 i、 e.四位数字中的数字应介于[1-4]之间,且不应重复 为了让你们简单地理解,我采用了两位数的模式 解决办法应该是: 12、21 i、 e.数字应为1或2,且不重复 为了确保它们不重复,我想用$1作为我第二个数字的条件,但它不起作用 请帮助我,并提前表示感谢。您可以使用此(): 第一个断言确保它是Regex 正则表达式匹配{1,2,3,4}的所有置换而不重复,regex,permutation,lookahead,negative-lookahead,Regex,Permutation,Lookahead,Negative Lookahead,我正在ruby中实现以下问题 以下是我想要的模式: 1234、1324、1432、1423、2341等 i、 e.四位数字中的数字应介于[1-4]之间,且不应重复 为了让你们简单地理解,我采用了两位数的模式 解决办法应该是: 12、21 i、 e.数字应为1或2,且不重复 为了确保它们不重复,我想用$1作为我第二个数字的条件,但它不起作用 请帮助我,并提前表示感谢。您可以使用此(): 第一个断言确保它是^[1-4]{4}$,第二个断言是一个负前瞻,确保您无法匹配*(.).*\1,即重复字符。第一
^[1-4]{4}$
,第二个断言是一个负前瞻,确保您无法匹配*(.).*\1
,即重复字符。第一个断言是“更便宜”,因此您希望首先这样做
工具书类
- 及
^(?:1()|2()|3()|4()){4}\1\2\3\4$
在使用每个唯一字符时,它后面的捕获组捕获一个空字符串。反向引用还尝试匹配空字符串,因此如果其中一个未成功,则只能表示关联组未参与匹配。只有当字符串至少包含一个副本时,才会发生这种情况
任何正则表达式风格都不正式支持这种空捕获组和反向引用的行为,因此请注意emptor。但它在大多数情况下都能工作,包括Ruby。我认为这个解决方案更简单一些
^(?:([1-4])(?!.*\1)){4}$
看到了吗
(?!.*\1)
是一个,以确保字符不会重复
^
和$
是匹配字符串开头和结尾的锚点。虽然前面的答案解决了这个问题,但它们并不像可能的那样通用,并且不允许在初始字符串中重复。例如,{a,a,b,b,c,c}
。问了一个问题后,给出了:
类似地,这适用于字符串中较长的“符号”,也适用于可变长度的符号。不带正则表达式:str.chars.sort.join==“1234”我复制并粘贴了此表达式,并尝试了文本1244,它与之匹配。它不能防止重复。@gsingh2011:RegExr是一个Flash应用程序,这意味着它使用ActionScript风格。ActionScript实现了ECMAScript标准,该标准规定,对尚未参加比赛的组的反向引用总是成功的,无论该组应该匹配什么。请参阅以进行讨论。这个噱头在JavaScript或VBScript中也不起作用,如果您指定
ECMAScript
选项,它在.NET中也不起作用,尽管它不起作用。感谢您的澄清。这很有趣。+1**第一个断言是“更便宜”,所以您希望先这样做**
^(?:([1-4])(?!.*\1)){4}$
^ # 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)a()|(?!\2)a()|(?!\3)b()|(?!\4)b()|(?!\5)c()|(?!\6)c()){6}$