Как я могу сопоставить любой символ в нескольких строках в регулярном выражении?

Например, это регулярное выражение

(.*)<FooBar>

будет соответствовать:

abcde<FooBar>

Но как мне сделать так, чтобы он совпадал по нескольким строкам?

abcde
fghij<FooBar>

262

Решение

Это зависит от языка, но должен быть модификатор, который вы можете добавить к шаблону регулярных выражений. В PHP это так:

/(.*)<FooBar>/s

s в конце заставляет точку совпадать все символы, включая переводы строки.

193

Другие решения

Попробуй это:

((.|\n)*)<FooBar>

Это в основном говорит, что «любой символ или перевод строки» повторяется ноль или более раз.

262

Если вы используете поиск Eclipse, вы можете включить опцию «DOTALL», чтобы сделать ‘.’ соответствует любому символу, включая разделители строк: просто добавьте «(? s)» в начале строки поиска. Пример:

(?s).*<FooBar>
61

Вопрос в том, может . образец соответствия любой персонаж? Ответ варьируется от двигателя к двигателю. Основное различие заключается в том, используется ли шаблон библиотекой регулярных выражений POSIX или не-POSIX.

Специальное примечание о : они не считаются регулярными выражениями, но . соответствует любому символу там, так же как движки на основе POSIX.

Еще одна заметка о а также : . соответствует любому символу по умолчанию (демонстрация): str = "abcde\n fghij<Foobar>"; expression = '(.*)<Foobar>*'; [tokens,matches] = regexp(str,expression,'tokens','match'); (tokens содержать abcde\n fghij вещь).

Кроме того, во всех В грамматиках регулярных выражений точка соответствует разрывам строк по умолчанию. ECMAScript грамматика Boost позволяет отключить это с regex_constants::no_mod_m (источник).

Что касается (это основано на POSIX), используйте n вариант (демонстрация): select regexp_substr('abcde' || chr(10) ||' fghij<Foobar>', '(.*)<Foobar>', 1, 1, 'n', 1) as results from dual

POSIX-движки:

Просто . уже соответствует переносу строк, нет необходимости использовать какие-либо модификаторы, см. (демонстрация).

(демонстрация), (демонстрация), (TRE, базовый двигатель R по умолчанию без perl=TRUEдля базы R с perl=TRUE или для stringr/стринги шаблоны, используйте (?s) встроенный модификатор) (демонстрация) также лечить . так же.

тем не мение, большинство инструментов на основе POSIX обрабатывают ввод построчно. Следовательно, . не соответствует разрывам строк только потому, что они не находятся в области видимости. Вот несколько примеров, как это переопределить:

  • — Есть несколько обходных путей, самый точный, но не очень безопасный sed 'H;1h;$!d;x; s/\(.*\)><Foobar>/\1/' (H;1h;$!d;x; хлебает файл в память). Если целые строки должны быть включены, sed '/start_pattern/,/end_pattern/d' file (удаление с начала закончится с включенными линиями) или sed '/start_pattern/,/end_pattern/{{//!d;};}' file (исключая совпадающие строки).
  • perl -0pe 's/(.*)<FooBar>/$1/gs' <<< "$str" (-0 глотает весь файл в память, -p печатает файл после применения скрипта, заданного -e). Обратите внимание, что с помощью -000pe захлопнет файл и активирует «режим абзаца», где Perl использует последовательные переводы строки (\n\n) в качестве разделителя записей.
  • grep -Poz '(?si)abc\K.*?(?=<Foobar>)' file, Вот, z разрешает файловое бред, (?s) включает режим DOTALL для . шаблон, (?i) включает режим без учета регистра, \K пропускает текст, соответствующий до сих пор, *? ленивый квантификатор, (?=<Foobar>) соответствует местоположению до <Foobar>,
  • pcregrep -Mi "(?si)abc\K.*?(?=<Foobar>)" file (M здесь можно использовать файл slurping). Заметка pcregrep хорошее решение для Mac OS grep пользователи.

Смотрите демоверсии.

Двигатели без POSIX:

ЗАМЕЧАНИЯ ПО (?s):

В большинстве не POSIX двигателей, (?s) встроенный модификатор (или встроенный параметр флага) может быть использован для обеспечения соблюдения . чтобы соответствовать разрывам строк.

Если поместить в начале шаблона, (?s) меняет поведение всех . в шаблоне. Если (?s) находится где-то после начала, только те . будут затронуты, которые расположены справа от него если это шаблон, переданный в Python re, В питоне re, независимо от (?s) расположение, весь шаблон . находятся под влиянием. (?s) эффект прекращается с помощью (?-s), Модифицированная группа может использоваться для воздействия только на указанный диапазон шаблона регулярных выражений (например, Delim1(?s:.*?)\nDelim2.* сделаю первый .*? матч через переводы строк и второй .* будет соответствовать только остальной части линии).

POSIX примечание:

В двигателях без регулярных выражений, чтобы соответствовать любому символу, [\s\S] / [\d\D] / [\w\W] конструкции могут быть использованы.

В POSIX, [\s\S] не соответствует ни одному символу (как в JavaScript или любом не-POSIX-движке), потому что escape-последовательности регулярного выражения не поддерживаются в выражениях в скобках. [\s\S] анализируется как выражения в скобках, которые соответствуют одному символу, \ или же s или же S,

45

В JavaScript используйте /[\S\s]*<Foobar>/, Источник

31

([\s\S]*)<FooBar>

Точка соответствует всем кроме новых строк (\ r \ n). Поэтому используйте \ s \ S, который будет соответствовать ВСЕМ символам.

27

В Рубин Вы можете использоватьmопция (многострочная):

/YOUR_REGEXP/m

Увидеть документация Regexp на ruby-doc.org для получения дополнительной информации.

18

мы также можем использовать

(.*?\n)*?

чтобы соответствовать всем, включая перевод строки без жадных

Это сделает новую строку необязательной

(.*?|\n)*?
10
По вопросам рекламы [email protected]