Regex: указанные слова в любом порядке

Я не очень хорош в регулярных выражениях, пытаюсь сделать 2 регулярных выражения.

Regex1:

Все указанные слова в любом порядке, но не более того. (повторение разрешено).

Regex2:

Все указанные слова в любом порядке, но не более того. (повторение не допускается).

Слова:

aaa, bbb, ccc

Строки:

aaa ccc bbb
aaa ccc
aaa bbb ddd ccc
bbb aaa bbb ccc

Regex1 оценивает вышеуказанные строки как:

true -> all word present in any order
false -> bbb is missing
false -> unknown word 'ddd'
false -> repetition not allowed

Regex2 оценивает вышеуказанные строки как:

true -> all word present in any order
false -> bbb is missing
false -> unknown word 'ddd'
true -> all word present in any order and repetition is allowed

Моя попытка

/^(?=.*\baaa\b)(?=.*\bbbb\b)(?=.*\bccc\b).*$/

Просьба о цели обучения, поэтому, пожалуйста, уточните это.

Ответы

Ответ 1

Для Regex 1:

var re = /^(?=.*?\baaa\b)(?=.*?\bbbb\b)(?=.*?\bccc\b)\b(?:aaa|bbb|ccc)\b(?: +\b(?:aaa|bbb|ccc)\b)*$/;
var res = document.getElementById('result');
res.innerText += re.test('aaa ccc bbb');
res.innerText += ', ' + re.test('aaa ccc ddd');
res.innerText += ', ' + re.test('aaa ddd bbb');
res.innerText += ', ' + re.test('ccc bbb ccc');
<div id="result"></div>

Ответ 2

Без повторения regex101

^(?:(aaa|bbb|ccc)(?!.*?\b\1) ?\b){3}$

И с повторением regex101

^(?=.*?\baaa)(?=.*?\bbbb)(?=.*?\bccc)(?:(aaa|bbb|ccc) ?\b)+$

Еще две идеи. Объяснение регулярного выражения в regex101 с правой стороны.

Ответ 3

зачем вам нужно регулярное выражение для выполнения этой функции? Вы можете легко достичь желаемого, сначала разделив строки разделителем ",". Затем вы можете создать объект словаря со словами, которые вы ищете, в качестве ключей и значений по умолчанию -1

Regex 2 может быть достигнуто путем циклического перебора входных слов и проверки, существуют ли они как ключи в объекте словаря. Регулярное выражение 1 может быть достигнуто аналогичным образом, только когда ключ сопоставляется с входным словом, его значение будет затем изменено на 1, а при следующем посещении может быть возвращено ложное совпадение.

Ответ 4

Не используйте регулярные выражения для уникальности.

Но для отдельных слов в регулярном выражении вы можете использовать \b

Пример: /\b(word1|word2|word3)\b/