【问题标题】:Is there a way regex will match all the combinations of the tokens in `|` operator有没有办法正则表达式匹配 `|` 运算符中的所有标记组合
【发布时间】:2020-06-19 20:21:26
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我认为我们可以按顺序列出正则表达式匹配,^(M|D|DM|A|AM|AD|ADM)\s*=7$ 以及按顺序匹配的输入标记
  • 这个问题可能是重复的,但这是您需要的正则表达式 ^([ADM])(?:(?!\1)([ADM])(?:(?!\1|\2)[ADM])?)?\s*=$ regex101.com/r/SNhJpf/2
  • 谢谢@Nick。您能否显示重复的链接并将此问题标记为重复?
  • 我一直在寻找它,但找不到它。我似乎记得在过去几天里看到过类似的东西(它是一个更通用的(.)(?!\1)(.)(?!\1|\2).),但我再也找不到它了。
  • 尼克,发布答案,这样至少我们可以投票给你 m8。

标签: regex nand2tetris


【解决方案1】:

应该这样做:

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

Demo

否定前瞻尝试匹配两个"M"、两个"D" 或两个"A"

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2014-08-30
    相关资源
    最近更新 更多