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

Очевидно, вы можете использовать | (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 символа или более, и в пароле нет пробелов.

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

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

  • Извлеките информацию внутри всех скобок в R
  • Как совместить «все до этой последовательности символов» в регулярном выражении?
  • Шаблон регулярного выражения для соответствия, Исключая, когда ... / За исключением между
  • Как сопоставить любой символ в нескольких строках в регулярном выражении?
  • Регулярные выражения и отрицание целой группы персонажей
  • Извлечение чисел из векторов строк
  • Регулярное выражение
  • Уход за регулярными выражениями
  • Существует ли регулярное выражение для определения правильного регулярного выражения?
  • Регулярное выражение для исключения слова / строки
  • Непонимание понимания групп и обратных ссылок
  • Interesting Posts

    Emacs не загружает gui

    Могу ли я контролировать локальный домен домена unix, например, tcpdump?

    Список аргументов слишком длинный для команд rm, cp, mv

    Как связать Угловое приложение для производства

    Безопасен ли Windows удаленный рабочий стол?

    Как вы передаете указатель на функцию-член?

    Наследование конструкторов

    В чем разница между sdelete -c и -z?

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

    Невозможно загрузить флешку на материнскую плату GIGABYTE

    Как установить тайм-аут сеанса в web.config

    Excel – разбитый вид листа горизонтально, но просмотр двух разделенных наборов столбцов вместо строк

    Как восстановить данные на отформатированном жестком диске и уже установить новую ОС

    Как редактировать текстовые файлы в командной строке Windows?

    Моя карта данных usb 3g иногда переключается на 2g, но не переключается обратно, не вставляя ее снова и снова.

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