Для регулярных выражений 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>
Ваш код уже выполняет часть уловки.Ваши положительные взгляды проверяют, что все слова появляются где-то, но не то, что они являются единственными присутствующими словами.Чтобы достичь этого, я добавил в начале окружность (^), чтобы определить начало строки.Затем группа без захвата \b(?:aaa|bbb|ccc)\b
, чтобы обнаружить первый экземпляр любого слова.Затем следует любое количество слов, перед которыми стоит хотя бы один пробел (?:\s+\b(?:aaa|bbb|ccc)\b)*
, в основном тот же шаблон, но с \ s + впереди и заключенный в *.И тогда нам нужно, чтобы строка где-то заканчивалась.Это делается с помощью знака доллара $
.
Для регулярного выражения 2:
Основная стратегия та же.Вы бы просто проверили с отрицательным взглядом, что подобранная строка больше не существует:
//var re = /^(?=.*?\baaa\b)(?!.*?\baaa\b.*?\baaa\b)(?=.*?\bbbb\b)(?!.*?\bbbb\b.*?\bbbb\b)(?=.*?\bccc\b)(?!.*?\bccc\b.*?\bccc\b)\b(?:aaa|bbb|ccc)\b(?:\s+\b(?:aaa|bbb|ccc)\b)*$/;
// optimized version, see comments
var re = /^(?=.*?\baaa\b)(?=.*?\bbbb\b)(?=.*?\bccc\b)(?!.*?\b(\w+)\b.*?\b\1\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 bbb aaa');
res.innerText += ', ' + re.test('aaa ccc bbb ccc');
<div id="result"></div>
Сначала у нас есть позитивный взгляд (?=.*?\bword\b)
, чтобы увидеть, что слово существует.Мы следуем этому отрицательному взгляду (?!.*?\baaa\b.*?\baaa\b)
, чтобы увидеть, что слово не существует несколько раз.Повторите для всех слов.Presto!
Обновление : Вместо того, чтобы проверять, не повторяются ли определенные слова, мы также можем проверить, что НЕТ слово повторяется с помощью конструкции (?!.*?\b(\w+)\b.*?\b\1\b)
.Это делает регулярное выражение более кратким.Спасибо @revo за указание на это.