正则表达式:以任意顺序匹配特定字符,每个字符的出现次数不超过指定的次数

标签 regex

我有一个字符列表,例如{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/

相关文章:

Java String ReplaceAll 方法给出非法重复错误?

regex - 使用现成的字符类并进一步限制它

c++ - 正则表达式 boost 库比较

regex - 正则表达式: Finding BB code in a piece of text

c# - .NET正则表达式识别 `if .. then .. else .. endif`

java - 捕获组中的可选子字符串

javascript - 使用正则表达式查找字符串中的所有子字符串javascript

Python 正则表达式匹配字符串中间

javascript - 从冒号向后捕获文本,直到逗号或行首

regex - 面临 Node.js 中正则表达式的问题