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

Очевидно, вы можете использовать | (pipe?) для представления OR , но есть ли способ представлять AND также?

В частности, я хотел бы совместить абзацы текста, содержащие ВСЕ определенную фразу, но не в определенном порядке.

12 Solutions collect form web for “Регулярные выражения: есть ли оператор И?”

Используйте непотребляющее регулярное выражение.

Типичная (например, Perl / Java) нотация:

(?= expr )

Это означает «match expr, но после этого продолжить сопоставление в исходной точке матча».

Вы можете делать столько, сколько хотите, и это будет «и». Пример:

(?=match this expression)(?=match this too)(?=oh, and this)

Вы даже можете добавлять группы захвата внутри не потребляющих выражений, если вам нужно сохранить некоторые данные в нем.

Вам нужно использовать lookahead, как говорили некоторые из других респондентов, но в lookahead должны учитываться другие символы между его целевым словом и текущей совпадающей позицией. Например:

 (?=.*word1)(?=.*word2)(?=.*word3) 

.* В первом lookahead позволяет ему сопоставлять любое количество символов, которое ему нужно, прежде чем оно попадет в «word1». Затем позиция совпадения сбрасывается, а второй lookahead ищет «word2». Сброс снова, и финальная часть соответствует «word3»; так как это последнее слово, которое вы проверяете, не обязательно, чтобы оно было в поиске, но это не повредит.

Чтобы соответствовать целому абзацу, вам необходимо привязать регулярное выражение с обоих концов и добавить окончательный .* Чтобы использовать оставшиеся символы. Используя нотацию в стиле Perl, это будет:

 /^(?=.*word1)(?=.*word2)(?=.*word3).*$/m 

Модификатор ‘m’ предназначен для многострочного режима; он позволяет совпадению ^ и $ на границах абзаца («границы строк» ​​в регулярном выражении). В этом случае важно, чтобы вы не использовали модификатор ‘s’, который позволяет метасимволу точек совпадать с символами новой строки, а также со всеми другими символами.

Наконец, вы хотите убедиться, что вы соответствуете целым словам, а не только fragmentы более длинных слов, поэтому вам нужно добавить границы слов:

 /^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b).*$/m 

Посмотрите на этот пример:

У нас есть 2 регулярных выражения A и B, и мы хотим сопоставить их оба, поэтому в псевдокоде это выглядит так:

 pattern = "/A AND B/" 

Он может быть написан без использования оператора AND следующим образом:

 pattern = "/NOT (NOT A OR NOT B)/" 

в PCRE:

 "/^(^A|^B)/" regexp_match(pattern,data) 

Вы можете сделать это с регулярным выражением, но, вероятно, вы захотите кого-то еще. Например, используйте несколько регулярных выражений и объедините их в условии if.

Вы можете перечислить все возможные перестановки со стандартным регулярным выражением, как это (соответствует a, b и c в любом порядке):

 (abc)|(bca)|(acb)|(bac)|(cab)|(cba) 

Однако это делает очень длинное и, вероятно, неэффективное регулярное выражение, если у вас более пары терминов.

Если вы используете расширенную версию regexp, например Perl или Java, у них есть лучшие способы сделать это. Другие ответы предложили использовать функцию позитивного обзора.

Оператор AND неявный в синтаксисе RegExp.
Вместо этого оператор OR должен быть указан с помощью трубы.
Следующий RegExp:

 var re = /ab/; 

означает букву a и букву b .
Он также работает с группами:

 var re = /(co)(de)/; 

это означает группу co AND group de .
Замена (неявного) И с помощью OR потребует следующих строк:

 var re = /a|b/; var re = /(co)|(de)/; 

Почему бы не использовать awk?
с awk regex AND, OR вопросы настолько просты

 awk '/WORD1/ && /WORD2/ && /WORD3/' myfile 

Невозможно ли в вашем случае сделать И на нескольких результатах сопоставления? в псевдокоде

 regexp_match(pattern1, data) && regexp_match(pattern2, data) && ... 

Если вы используете регулярные выражения Perl, вы можете использовать позитивный просмотр:

Например

 (?=[1-9][0-9]{2})[0-9]*[05]\b 

будет числом больше 100 и делится на 5

Вы можете передать свой вывод другому регулярному выражению. Используя grep, вы можете сделать это:

grep A | grep B

В дополнение к принятому ответу

Я приведу вам некоторые практические примеры, которые помогут вам понять некоторые из вас. Например, скажем, у нас есть три строки текста:

 [12/Oct/2015:00:37:29 +0200] // only this + will get selected [12/Oct/2015:00:37:x9 +0200] [12/Oct/2015:00:37:29 +020x] 

Смотрите демо здесь DEMO

Здесь мы хотим выбрать знак +, но только после двух чисел с пробелом и до четырех цифр. Это единственные ограничения. Для этого мы будем использовать это регулярное выражение:

 '~(?< =\d{2} )\+(?=\d{4})~g' 

Обратите внимание, что если вы отделите выражение, оно даст вам разные результаты.

Или, возможно, вы хотите выбрать текст между тегами ... но не tags! Тогда вы можете использовать:

 '~(?< =

).*?(?=< \/p>)~g'

для этого текста:

 

Hello !

I wont select tags! Only text with in

Смотрите демо здесь DEMO

Используйте AND вне регулярного выражения. В PHP оператор lookahead, похоже, не работал для меня, вместо этого я использовал это

 if( preg_match("/^.{3,}$/",$pass1) && !preg_match("/\s{1}/",$pass1)) return true; else return false; 

Вышеупомянутое регулярное выражение будет соответствовать, если длина пароля составляет 3 символа или более, и в пароле нет пробелов.

Порядок всегда подразумевается в структуре регулярного выражения. Чтобы выполнить то, что вы хотите, вам придется сопоставлять строку ввода несколько раз с разными выражениями.

То, что вы хотите сделать, невозможно с одним регулярным выражением.

Interesting Posts

SQL-запрос возвращает данные из нескольких таблиц

Команда Grep, чтобы удалить строки, содержащие указанное слово

Excel исчерпал ресурсы, пытаясь вычислить одну или несколько формул

Ошибка Google Chrome 138

Могу ли я дважды загружать Linux и Windows 7, но использовать загрузчик Windows вместо GRUB?

Негабаритный (более высокого разрешения) виртуальный рабочий стол путем масштабирования / масштабирования для Windows (XP)?

Как настроить вторую сетевую карту для использования на рабочей станции VMWare?

Как проверить, является ли образ ISO загрузочным?

Как удалить предыдущие сетевые подключения из Windows 7?

Создание отдельных архивов для набора файлов

Notepad ++. Как заменить разные символы соответствующими буквами одновременно?

Высокая латентность / пинг для локальных шлюзов WHILE STREAMING

Инструмент языкового перевода

Как сделать снимок экрана над окном, большим, чем экран

Материнская плата с низким энергопотреблением для домашнего сервера Windows

Давайте будем гением компьютера.