如何编写一个RegEx模式,接受一个字符串,每个字母最多一个,但是无序?

时间:2014-07-17 14:46:08

标签: regex pattern-matching

我试过这个:

[a]?[b]?[c]?[d]?[e]?[f]?[g]?[h]?[i]?[j]?[k]?[l]?[m]?[n]?[o]?[p]?[q]?[r]?[s]?[t]?[u]?[v]?[w]?[x]?[y]?[z]?

但是这个RegEx拒绝字符串,其中的顺序不是按字母顺序排列的,如下所示:

  • “ZABC”
  • “AZB”

我希望这两种模式也被接受。我怎么能这样做?

编辑1

我不想重复字母,即我希望拒绝以下字符串:

  • aazb
  • ozob

感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用negative lookahead assertion确保没有两个字符相同:

^(?!.*(.).*\1)[a-z]*$

<强>解释

^      # Start of string
(?!    # Assert that it's impossible to match the following:
 .*    # any number of characters
 (.)   # followed by one character (capture that in group 1)
 .*    # followed by any number of characters
 \1    # followed by the same character as the one captured before
)      # End of lookahead
[a-z]* # Match any number of ASCII lowercase letters
$      # End of string

测试live on regex101.com

注意:此正则表达式需要强制检查所有可能的字符对,因此性能可能是较大字符串的问题。如果你可以使用除了正则表达式之外的任何东西,你会更快乐。例如,在Python中:

if re.search("^[a-z]*$", mystring) and len(mystring) == len(set(mystring)):
   # valid string