Например, это регулярное выражение
(.*)<FooBar>
будет соответствовать:
abcde<FooBar>
Но как мне сделать так, чтобы он совпадал по нескольким строкам?
abcde
fghij<FooBar>
Это зависит от языка, но должен быть модификатор, который вы можете добавить к шаблону регулярных выражений. В PHP это так:
/(.*)<FooBar>/s
s в конце заставляет точку совпадать все символы, включая переводы строки.
Попробуй это:
((.|\n)*)<FooBar>
Это в основном говорит, что «любой символ или перевод строки» повторяется ноль или более раз.
Если вы используете поиск Eclipse, вы можете включить опцию «DOTALL», чтобы сделать ‘.’ соответствует любому символу, включая разделители строк: просто добавьте «(? s)» в начале строки поиска. Пример:
(?s).*<FooBar>
Вопрос в том, может .
образец соответствия любой персонаж? Ответ варьируется от двигателя к двигателю. Основное различие заключается в том, используется ли шаблон библиотекой регулярных выражений POSIX или не-POSIX.
Специальное примечание о Lua-модель: они не считаются регулярными выражениями, но .
соответствует любому символу там, так же как движки на основе POSIX.
Еще одна заметка о MATLAB а также октава: .
соответствует любому символу по умолчанию (демонстрация): 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-движки:
Просто .
уже соответствует переносу строк, нет необходимости использовать какие-либо модификаторы, см. удар (демонстрация).
TCL (демонстрация), PostgreSQL (демонстрация), р (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
модификатор PCRE_DOTALL модификатор: preg_match('~(.*)<Foobar>~s', $s, $m)
(демонстрация)RegexOptions.Singleline
флаг (демонстрация): var result = Regex.Match(s, @"(.*)<Foobar>", RegexOptions.Singleline).Groups[1].Value;
var result = Regex.Match(s, @"(?s)(.*)<Foobar>").Groups[1].Value;
(?s)
встроенный вариант: $s = "abcde`nfghij<FooBar>"; $s -match "(?s)(.*)<Foobar>"; $matches[1]
s
модификатор (или (?s)
встроенная версия в начале) (демонстрация): /(.*)<FooBar>/s
re.DOTALL
(или же re.S
) флаги или (?s)
встроенный модификатор (демонстрация): m = re.search(r"(.*)<FooBar>", s, flags=re.S)
(а потом if m:
, print(m.group(1))
)Pattern.DOTALL
модификатор (или встроенный (?s)
флаг) (демонстрация): Pattern.compile("(.*)<FooBar>", Pattern.DOTALL)
(?s)
модификатор in-pattern (демонстрация): regex = /(?s)(.*)<FooBar>/
(?s)
модификатор (демонстрация): "(?s)(.*)<Foobar>".r.findAllIn("abcde\n fghij<Foobar>").matchData foreach { m => println(m.group(1)) }
[^]
или обходные пути [\d\D]
/ [\w\W]
/ [\s\S]
(демонстрация): s.match(/([\s\S]*)<FooBar>/)[1]
std::regex
) Используйте [\s\S]
или обходные пути JS (демонстрация): regex rex(R"(([\s\S]*)<FooBar>)");
([\s\S]*)<Foobar>
,/m
MULTILINE модификатор (демонстрация): s[/(.*)<Foobar>/m, 1]
(?s)
в начале (демонстрация): re: = regexp.MustCompile(`(?s)(.*)<FooBar>`)
dotMatchesLineSeparators
или (легче) передать (?s)
встроенный модификатор в шаблон: let rx = "(?s)(.*)<Foobar>"
(?s)
работает проще всего, но вот как опция может быть использована: NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern
options:NSRegularExpressionDotMatchesLineSeparators error:®exError];
(?s)
модификатор (демонстрация): "(?s)(.*)<Foobar>"
(в таблицах Google, =REGEXEXTRACT(A2,"(?s)(.*)<Foobar>")
)ЗАМЕЧАНИЯ ПО (?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
,
В JavaScript используйте /[\S\s]*<Foobar>/
, Источник
([\s\S]*)<FooBar>
Точка соответствует всем кроме новых строк (\ r \ n). Поэтому используйте \ s \ S, который будет соответствовать ВСЕМ символам.
В Рубин Рубин Вы можете использоватьm
опция (многострочная):
/YOUR_REGEXP/m
Увидеть документация Regexp на ruby-doc.org для получения дополнительной информации.
мы также можем использовать
(.*?\n)*?
чтобы соответствовать всем, включая перевод строки без жадных
Это сделает новую строку необязательной
(.*?|\n)*?