Ruby正则表达式(正则表达式):字符最多只出现一次

pai*_*ind 4 ruby regex

假设我想确保字符串x等于abcd的任何组合(每个字符出现一次或零次 - >每个字符不应重复,但组合可能以任何顺序出现)

  1. 有效的ex:bc .. abcd ... bcad ... b ... d .. dc
  2. 无效的前.abcdd,cc,bbbb,abcde(ofcourse)

我的努力:我尝试了各种技巧:我最接近的是x =〜^(((a)?(b)?(c)?(d)?))$

但是,如果我不按照我写的顺序输入它们,这将不起作用:

  1. 适用于:ab,acd,abcd,a,d,c
  2. 不适用于:bcda,cb,da(任何不符合上述顺序的东西)

您可以在此处测试您的解决方案:http://rubular.com/r/wCpD355bub

PS:字符可能不是按字母顺序排列,也可能是字母顺序

Chr*_*ald 5

如果您可以使用除正则表达式之外的东西,您可以尝试:

str.chars.uniq.length == str.length && str.match(/^[a-d]+$/)
Run Code Online (Sandbox Code Playgroud)

这里的一般想法是你只是从字符串中删除任何重复的字符,如果uniq数组的长度不等于源字符串的长度,则字符串中有一个重复的字符.然后正则表达式强制执行字符集.

这可能会有所改进,但它非常简单.它确实会创建一些额外的阵列,因此如果需要在性能关键的位置使用它,您可能需要不同的方法.

如果你想坚持正则表达式,你可以使用:

str.match(/^[a-d]+$/) && !str.match(/([a-d]).*\1/)
Run Code Online (Sandbox Code Playgroud)

这基本上会检查字符串是否只包含允许的字符,并且这些字符永远不会重复.