有没有办法正则表达式匹配`|`运算符中标记的所有组合

Is there a way regex will match all the combinations of the tokens in `|` operator

我正在为 nand2tetris 项目做解析器。我想检查目标字段是否是 M|D|MD|A|AM|AD|AMD 以及它们的不同组合方式,例如 MA 而不仅仅是 AM

^(M|D|MD|A|AM|AD|AMD)\s*=$

此正则表达式正确匹配 AM=,但不匹配 MA=

我不想列出这些标记的所有可能组合,有没有办法简单地做到这一点?

应该这样做:

^(?=[MDA]+$)(?!.?(.).?).{1,3}$

Demo

否定先行尝试匹配两个 "M"、两个 "D" 或两个 "A"

正向先行仅将字符串中的字符限制为"M""D""A"。这不是必需的,但它允许我在其余部分使用 .,而不是 (?![MDA]?([MDA])[MDA]?...),这可能使它更容易阅读。