Оператор регулярного выражения И - PullRequest
36 голосов
/ 15 июня 2010

На основании этого ответа

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

Я попытался выполнить следующие действия на http://regexpal.com/, но не смог получитьэто на работу.Чего не хватает?Javascript не поддерживает его?

Регулярное выражение: (?=foo)(?=baz)

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

Ответы [ 4 ]

69 голосов
/ 15 июня 2010

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

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

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

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

10 голосов
/ 08 июня 2016

Пример поиска логического (И) плюс подстановочного знака, который я использую внутри плагина автозаполнения JavaScript:

Соответствующая строка: "мое слово"

Строка для поиска: «Я ищу свои забавные слова в этом тексте»

Вам нужно следующее регулярное выражение: /^(?=.*my)(?=.*word).*$/im

Разъяснение:

^ утверждение позиции в начале строки

? = Позитивный взгляд

. * соответствует любому символу (кроме новой строки)

() Группы

$ подтверждение позиции в конце строки

i модификатор: нечувствителен. Соответствие без учета регистра (игнорирует регистр [a-zA-Z])

m Модификатор: многострочный. Заставляет ^ и $ совпадать с началом / концом каждой строки (не только с началом / концом строки)

Проверьте здесь регулярное выражение: 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>
5 голосов
/ 24 февраля 2016

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

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

Регулярное выражение: (foo)|(baz)

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

0 голосов
/ 05 апреля 2016

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...