Использование lookahead . Попробуйте это:
if( inputArray.length>1 ) rgx = "(?=.*" + inputArray.join( ")(?=.*" ) + ").*";
В итоге вы получите что-то вроде
(?=.*dog)(?=.*cat)(?=.*mouse).*
Что должно совпадать только если все слова появляются, но они могут быть в любом порядке .
- Собака съела кошку, которая съела мышь.
- Мышь была съедена собакой и кошкой.
- Большинство кошек любят мышей и собак.
но не
- Собака у мыши.
- Кошки и собаки как мыши.
Способ работы состоит в том, что механизм регулярных выражений сканирует текущую точку совпадения (0) в поисках .*dog
, первого суб-регулярного выражения (любое число любого символа, за которым следует dog ). Когда он определяет истинность этого регулярного выражения, он сбрасывает точку совпадения (обратно в 0) и переходит к следующему дополнительному регулярному выражению. Итак, сеть состоит в том, что не имеет значения, где находится каждое слово; только то, что каждое слово найдено.
EDIT: @Justin указал, что у меня должен быть трейлинг .*
, который я добавил выше. Без этого text.match(regex)
работает, но regex.exec(text)
возвращает пустую строку соответствия. С завершающим .*
вы получите соответствующую строку.