Подтвердить что ты не робот

Оператор Regex AND

Основываясь на этом ответе

Регулярные выражения: есть ли оператор AND?

Я пробовал следующее на http://regexpal.com/, но не смог заставить его работать. Что пропало? Не поддерживает ли javascript его?

Regex: (?=foo)(?=baz)

Строка: foo,bar,baz

4b9b3361

Ответ 1

Нельзя одновременно сопоставить (?=foo) и (?=baz). Требуется, чтобы следующий символ был одновременно f и b что невозможно.

Возможно, вы хотите это вместо этого:

(?=.*foo)(?=.*baz)

Это говорит о том, что foo должен появляться где угодно, а baz должен появляться где угодно, не обязательно в этом порядке и, возможно, с перекрытием (хотя в данном конкретном случае перекрытие невозможно, поскольку сами буквы не перекрываются).

Ответ 2

Пример поиска по логическому (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, которая:

  1. Замените зарезервированные символы регулярного выражения, чтобы избежать ошибок
  2. Разбейте свою строку на пробелы
  3. Инкапсулируйте свои слова в регулярных выражениях
  4. Создать шаблон регулярных выражений
  5. Выполнить совпадение с регулярным выражением

Пример:

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>

Ответ 3

Может быть, просто оператор ИЛИ | может быть достаточно для вашей проблемы:

Строка: foo,bar,baz

Regex: (foo)|(baz)

Результат: ["foo", "baz"]

Ответ 4

Возможно, вы ищете что-то вроде этого. Если вы хотите выбрать полную строку, когда она содержит одновременно "foo" и "baz", этот RegEx будет соответствовать тому, что:

.*(foo)+.*(baz)+|.*(baz)+.*(foo)+.*