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

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

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

Особое примечание о шаблонах lua : они не считаются регулярными выражениями, но . соответствует любому символу там, так же как движки на основе POSIX.

Еще одно примечание о матлабах и октавах : соответствует любому символу по умолчанию ( демо ): str = "abcden fghij{amp}lt;Foobar{amp}gt;"; expression = '(.*){amp}lt;Foobar{amp}gt;*'; [tokens,matches] = regexp(str,expression,'tokens','match'); str = "abcden fghij{amp}lt;Foobar{amp}gt;"; expression = '(.*){amp}lt;Foobar{amp}gt;*'; [tokens,matches] = regexp(str,expression,'tokens','match'); ( tokens содержат элемент abcden fghij ).

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

Что касается оракула (он основан на POSIX), используйте n option ( demo ): select regexp_substr('abcde' || chr(10) ||' fghij{amp}lt;Foobar{amp}gt;', '(.*){amp}lt;Foobar{amp}gt;', 1, 1, 'n', 1) as results from dual

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

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

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

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

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

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

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

  • php — использовать модификатор s Модификатор PCRE_DOTALL : preg_match('~(.*){amp}lt;Foobar{amp}gt;~s', $s, $m) ( демонстрация )
  • c # — Использовать флаг RegexOptions.Singleline ( демо ):
    var result = Regex.Match(s, @"(.*){amp}lt;Foobar{amp}gt;", RegexOptions.Singleline).Groups[1].Value;
    var result = Regex.Match(s, @"(?s)(.*){amp}lt;Foobar{amp}gt;").Groups[1].Value;
  • powershell — Использовать встроенный параметр (?s) : $s = "abcde`nfghij{amp}lt;FooBar{amp}gt;"; $s -match "(?s)(.*){amp}lt;Foobar{amp}gt;"; $matches[1] $s = "abcde`nfghij{amp}lt;FooBar{amp}gt;"; $s -match "(?s)(.*){amp}lt;Foobar{amp}gt;"; $matches[1]
  • perl — использовать модификатор s (или (?s) встроенную версию при запуске) ( демо ): /(.*){amp}lt;FooBar{amp}gt;/s
  • python — Используйте re.DOTALL (или re.S ) или (?s) встроенный модификатор ( демо ): m = re.search(r"(.*){amp}lt;FooBar{amp}gt;", s, flags=re.S) ( а затем, if m: print(m.group(1)) )
  • Java — использовать модификатор Pattern.DOTALL (или встроенный флаг (?s) ) ( демо ): Pattern.compile("(.*){amp}lt;FooBar{amp}gt;", Pattern.DOTALL)
  • groovy — использовать (?s) in-pattern модификатор ( демо ): regex = /(?s)(.*){amp}lt;FooBar{amp}gt;/
  • scala — Использовать модификатор (?s) ( демо ): "(?s)(.*){amp}lt;Foobar{amp}gt;".r.findAllIn("abcden fghij{amp}lt;Foobar{amp}gt;").matchData foreach { m ={amp}gt; println(m.group(1)) }
  • JavaScript — используйте [^] или обходные пути [dD] / [wW] / [sS] ( демонстрация ): s.match(/([sS]*){amp}lt;FooBar{amp}gt;/)[1]
  • c ( std::regex ) Используйте [sS] или обходные пути JS ( демонстрация ): regex rex(R"(([sS]*){amp}lt;FooBar{amp}gt;)");
  • vba — использовать тот же подход, что и в JavaScript, ([sS]*){amp}lt;Foobar{amp}gt; .
  • ruby — использовать /m MULTILINE модификатор ( демо ): s[/(.*){amp}lt;Foobar{amp}gt;/m, 1]
  • go — Используйте встроенный модификатор (?s) в начале ( демо ): re: = regexp.MustCompile(`(?s)(.*){amp}lt;FooBar{amp}gt;`)
  • swift — используйте dotMatchesLineSeparators или (проще) передать встроенный модификатор (?s) в шаблон: let rx = "(?s)(.*){amp}lt;Foobar{amp}gt;"
  • target-c — То же, что и Swift, (?s) работает проще всего, но вот как этот параметр можно использовать : NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionDotMatchesLineSeparators error:{amp}amp;regexError];
  • re2 , google-apps-script — Использовать модификатор (?s) ( демо ): "(?s)(.*){amp}lt;Foobar{amp}gt;" (в таблицах Google, =REGEXEXTRACT(A2,"(?s)(.*){amp}lt;Foobar{amp}gt;") )

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

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

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

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

В двигателях регулярных выражений, отличных от POSIX, для сопоставления с любым символом можно использовать конструкции [sS] / [dD] / [wW] .

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

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector