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/