Вопрос
На основании этого ответа
Регулярные выражения: есть ли и оператор?
Я попробовал следующее на http://regexpal.com/ Но не смог добраться до работы. Что не хватает? JavaScript не поддерживает это?
Regex: (?=foo)(?=baz)
Нить: foo,bar,baz
Решение
Это невозможно для обоих (?=foo)
а также (?=baz)
соответствовать одновременно. Это потребует следующего персонажа, чтобы быть оба f
а также b
одновременно что невозможно.
Возможно, вы хотите это вместо этого:
(?=.*foo)(?=.*baz)
Это говорит о том, что foo
должен появиться где угодно и baz
Должен появиться в любом месте, не обязательно в этом порядке и, возможно, перекрытие (хотя перекрытие невозможно в этом конкретном случае, потому что буквы сами не перекрываются).
Другие советы
Пример булевой (и) плюс поиск подстановки, который я использую внутри плагина AutoComplete JavaScript:
Строка, чтобы соответствовать: «Мое слово»
Строка для поиска: «Я ищу свои забавные слова в этом тексте»
Вам нужно следующее Regex:/^(?=.*my)(?=.*word).*$/im
Объяснение:
^ Устанавливать позицию в начале строки
?= Положительный вид
.* соответствует любому символу (кроме новой строки)
() Группы
$ Устанавливать позицию в конце строки
я Модификатор: нечувствителен. Нечувствительное дело (игнорирует случай [A-ZA-Z])
М. Модификатор: многострочный. Причины ^ и $, чтобы сопоставить начало / конец каждой строки (не только начало / конец строки)
Проверьте регельс здесь: https://regex101.com/r/is5jj3/1.
Итак, вы можете создать функцию JavaScript, которая:
- Замените Regex зарезервированные символы, чтобы избежать ошибок
- Разделить свою строку в пробелах
- Инкапсулировать ваши слова внутри групп Regex
- Создать рисунок Regex
- Выполнить матч Regex
Пример:
function fullTextCompare(myWords, toMatch){
//Replace regex reserved characters
myWords=myWords.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
//Split your string at spaces
arrWords = myWords.split(" ");
//Encapsulate your words inside regex groups
arrWords = $.map( arrWords, function( n ) {
return ["(?=.*"+n+")"];
});
//Create a regex pattern
sRegex = new RegExp("^"+arrWords.join("")+".*$","im");
//Execute the regex match
return(toMatch.match(sRegex)===null?false:true);
}
//Using it:
console.log(
fullTextCompare("my word","I'm searching for my funny words inside this text")
);
//Wildcards:
console.log(
fullTextCompare("y wo","I'm searching for my funny words inside this text")
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Может быть, просто или оператор |
может быть достаточно для вашей проблемы:
Нить: foo,bar,baz
Regex: (foo)|(baz)
Результат: ["foo", "baz"]
Может быть, вы ищете что-то вроде этого. Если вы хотите выбрать полную строку, когда она содержит как «Foo», так и «BAZ» одновременно, это Regex будет соответствовать, что:
.*(foo)+.*(baz)+|.*(baz)+.*(foo)+.*