Есть ли способ, чтобы регулярное выражение совпадало со всеми комбинациями токенов в операторе `|` - PullRequest
1 голос
/ 07 марта 2020

Я делаю парсер для проекта nand2tetris . Я хочу проверить, является ли поле назначения либо M|D|MD|A|AM|AD|AMD, а также различные варианты комбинаций, например MA, а не только AM.

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

Это регулярное выражение правильно соответствует AM=, но не MA=.

Я не хочу перечислять все возможные комбинации этих токенов, есть ли способ сделать это просто?

1 Ответ

2 голосов
/ 07 марта 2020

Это должно сделать это:

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

Демо

Отрицательный взгляд пытается найти два "M", два "D" или два "A".

Позитивный взгляд просто ограничивает символы в строке "M", "D" и "A". В этом не было необходимости, но это позволяет мне использовать . в остальных, а не (?![MDA]?([MDA])[MDA]?...), что может облегчить чтение.

...