Вероятно, не стоит делать это с помощью регулярного выражения. (Чистое, информатика) регулярное выражение «не в счет». Единственная «память», которую он имеет в любой момент - это состояние DFA. Чтобы сопоставить несколько слов в любом порядке без повторения, вам потребуется порядка 2 ^ n состояний. Так что, вероятно, действительно ужасное регулярное выражение.
(Кроме того: я упоминаю «чистые, компьютерные» регулярные выражения, потому что большинство реализаций на самом деле являются расширениями и позволяют вам выполнять нерегулярные вещи. сделай то, что ты хочешь сделать, менее безболезненно с помощью одного шаблона.)
Лучшим подходом было бы сохранить словарь (объект в JavaScript), который сопоставляет слова со счетчиками. Инициализируйте его под свой набор слов с соответствующими значениями для каждого. Вы можете использовать регулярное выражение для сопоставления слов, а затем для каждого найденного слова уменьшать значение соответствующей записи в словаре. Если в конце словаря содержатся значения, отличные от 0, или если где-то очень длинный путь, по которому вы пытаетесь преуменьшить значение (или уменьшить значение, которое не существует), значит, у вас есть неудачное совпадение.