Основываясь на этом ответе
Регулярные выражения: есть ли оператор AND?
Я пробовал следующее на http://regexpal.com/, но не смог заставить его работать. Что пропало? Не поддерживает ли javascript его?
Regex: (?=foo)(?=baz)
Строка: foo,bar,baz
Основываясь на этом ответе
Регулярные выражения: есть ли оператор AND?
Я пробовал следующее на http://regexpal.com/, но не смог заставить его работать. Что пропало? Не поддерживает ли javascript его?
Regex: (?=foo)(?=baz)
Строка: foo,bar,baz
Нельзя одновременно сопоставить (?=foo)
и (?=baz)
. Требуется, чтобы следующий символ был одновременно f
и b
что невозможно.
Возможно, вы хотите это вместо этого:
(?=.*foo)(?=.*baz)
Это говорит о том, что foo
должен появляться где угодно, а baz
должен появляться где угодно, не обязательно в этом порядке и, возможно, с перекрытием (хотя в данном конкретном случае перекрытие невозможно, поскольку сами буквы не перекрываются).
Пример поиска по логическому (AND) плюс подстановочному знаку, который я использую внутри плагина автозаполнения JavaScript:
Соответствующая строка: "my word"
Строка для поиска: "I'm searching for my funny words inside this text"
Вам нужно следующее регулярное выражение: /^(?=.*my)(?=.*word).*$/im
Объяснение:
^ утвердить позицию в начале строки
? = Позитивный "Lookahead"
.* matches any character (except newline)
() Groups
$ утвердить позицию в конце строки
i modifier: insensitive. Case insensitive match (ignores case of [a-zA-Z])
m modifier: multi-line. Causes ^ и $ to match the begin/end of each line (not only begin/end of string)
Проверьте регулярное выражение здесь: https://regex101.com/r/iS5jJ3/1
Таким образом, вы можете создать функцию javascript, которая:
Пример:
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)+.*