我有一个字符列表,例如{o、b、c、c、d、o、f}
。
如果字符串包含不在该列表中的字符,我不希望它成为匹配项。如果字符串中某个字符出现的次数多于该列表中该字符出现的次数,我不希望它成为匹配项。
字符串中的字符可以按任何顺序出现,并且不必所有字符都出现。在上面的示例中,"foo"
应该是匹配项,但不是 "fooo"
。
例如,我将上面的示例缩小为 (o{0,2}b?c{0,2}d?f?)
,但这并不完全有效,因为该正则表达式中的顺序很重要。我得到了 "oof"
的匹配项,但没有得到 "foo"
的匹配项。
最佳答案
正如 gview 所说,正则表达式不是正确的工具。但是,如果您的正则表达式引擎支持前瞻,您可以使用:
^(?=(?:[^o]*o){0,2}[^o]*$)(?=(?:[^c]*c){0,2}[^c]*$)(?=[^b]*b?[^b]*$)(?=[^d]*d?[^d]*$)(?=[^f]*f?[^f]*$)[obcdf]+$
有点长但很简单:
字符串与^[obcdf]+$
匹配(注意 anchor 的使用)。
前瞻(?=...)
只是检查(后面跟着):
(?=(?:[^o]*o){0,2}[^o]*$) # no more than 2 o until the end
(?=[^b]*b?[^b]*$) # no more than 1 b until the end
lookaheads 中的每个子模式都描述整个字符串。
关于正则表达式:以任意顺序匹配特定字符,每个字符的出现次数不超过指定的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22411445/