正则表达式匹配中的固定字符数

fixed number of characters in a regex match

有没有办法通过正则表达式匹配固定长度字符串中固定数量的字符?

例如,我想匹配字符串长度为 5 且恰好有 3 个字母和 2 个感叹号 (!) 的所有字符串。感叹号可以在字符串中的任何位置。

匹配示例:abc!!、a!b!c、!!abc、a!!bc

我尝试使用先行匹配,但无法限制长度。以下是我使用的正则表达式。

(?=\w*!\w*!\w*)[\w!]{5}

这匹配 a!!!b 和 a!!!!以及我不想要的。

可能最简单的方法就是指定所有可能性。

(?=\w\w\w!!|\w\w\!\w\!|\w\w\!!\w|\w!\w\w!|\w!\w!\w|\w!!\w\w|!\w!\w\w|!!\w\w\w)

正则表达式不适用于 combinations/permutations。

如果组合的数量太多,请在第一个正则表达式收集潜在匹配项,第二个(及以后)继续验证它的部分进行。

[\w!]{5}
match.count('!') == 2
match.count('\w') == 3

(这不是有效代码 -- 只是一个概念)

您可以使用基于前瞻的正则表达式来执行此操作。

^(?=(?:\w*!){2}\w*$)[\w!]{5}$

Live Demo