Уточнить; Первоначально я использовал Eclipse для поиска и замены в нескольких файлах. Из ответов ниже я обнаружил, что моей проблемой был инструмент, а не шаблон регулярных выражений.
Андюк
2
Ваш флаг «затмение» должен быть удален, потому что тот, кто ищет решение для затмения, найдет этот вопрос (как я), а затем найдет решение без затмения, как принятое.
Acme
2
Теперь я нахожу это в поисковой системе, потому что затмение было упомянуто. Ох уж ужас.
Брайан Олсен
Ответы:
240
Это зависит от языка, но должен быть модификатор, который вы можете добавить к шаблону регулярных выражений. В PHP это:
/(.*)<FooBar>/s
Символ s в конце заставляет точку совпадать со всеми символами, включая символы новой строки.
а что если я хотел просто новую строку, а не все символы?
Грейс
3
@Grace: используйте \ n для соответствия новой строки
Джереми Рутен
5
Флаг s (сейчас?) Недействителен, по крайней мере, в Chrome / V8. Вместо этого используйте / ([\ s \ S] *) <FooBar> / символьный класс (соответствует пробелу и не пробелу) вместо сопоставителя периода. См. Другие ответы для получения дополнительной информации.
Аллен
8
@Allen - JavaScript не поддерживает sмодификатор. Вместо этого делайте [^]*для того же эффекта.
Дерек 朕 會 功夫
1
В Ruby используйте mмодификатор
Райан Бакли
358
Попробуй это:
((.|\n)*)<FooBar>
Это в основном говорит, что «любой символ или перевод строки» повторяется ноль или более раз.
Это зависит от языка и / или инструмента, который вы используете. Пожалуйста, дайте нам знать, что вы используете, например, Perl, PHP, CF, C #, sed, awk и т. Д.
Ben Doom
39
В зависимости от окончания вашей линии вам может понадобиться((.|\n|\r)*)<FooBar>
Potherca
3
Он сказал, что использует Eclipse. Это правильное решение на мой взгляд. У меня та же проблема, и это решило ее.
Дунайский моряк
4
Правильно - вопрос о затмении, как и о тегах. Но принятое решение - это решение PHP. Ваше решение должно быть принято ...
acme
16
Это худшее регулярное выражение для сопоставления многострочного ввода. Пожалуйста, никогда не используйте его, если вы не используете ElasticSearch. Используйте [\s\S]*или (?s).*.
Виктор Стрибовев
89
Вопрос в том, может ли .шаблон соответствовать любому персонажу? Ответ варьируется от двигателя к двигателю. Основное различие заключается в том, используется ли шаблон библиотекой регулярных выражений POSIX или не-POSIX.
Специальное примечание о Lua-модель: они не считаются регулярными выражениями, но .соответствуют любому символу там, так же как и движки на основе POSIX.
Еще одна заметка о MATLAB а также октава: .соответствует любому символу по умолчанию ( демо ): str = "abcde\n fghij<Foobar>"; expression = '(.*)<Foobar>*'; [tokens,matches] = regexp(str,expression,'tokens','match');( tokensсодержит abcde\n fghijэлемент).
Кроме того, во всех увеличениеПо умолчанию в регулярных выражениях точка соответствует разрывам строк. Boost's ECMAScript грамматика позволяет отключить это с помощью 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 / STRINGI шаблонов, использовать (?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- perl -0pe 's/(.*)<FooBar>/$1/gs' <<< "$str"( -0удаляет весь файл в память, -pпечатает файл после применения сценария, заданного -e). Обратите внимание, что при использовании -000peбудет захвачен файл и активирован «режим абзаца», где Perl использует последовательные символы новой строки ( \n\n) в качестве разделителя записей.
гну-Grep- grep -Poz '(?si)abc\K.*?(?=<Foobar>)' file. Здесь, zвключает в себя файл slurping, (?s)включает режим DOTALL для .шаблона, (?i)включает режим без учета регистра, \Kпропускает сопоставленный текст до сих пор, *?является ленивым квантификатором, (?=<Foobar>)соответствует местоположению ранее <Foobar>.
pcregrep- pcregrep -Mi "(?si)abc\K.*?(?=<Foobar>)" file(здесь Mвключается слежка за файлами). Примечание pcregrep- хорошее решение для grepпользователей Mac OS .
C #- Используйте RegexOptions.Singlelineфлаг ( демо ): - var result = Regex.Match(s, @"(.*)<Foobar>", RegexOptions.Singleline).Groups[1].Value; -var result = Regex.Match(s, @"(?s)(.*)<Foobar>").Groups[1].Value;
Perl- Используйте 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)) }
Javascript- Использование [^]или обходные пути [\d\D]/ [\w\W]/ [\s\S]( демо ):s.match(/([\s\S]*)<FooBar>/)[1]
C ++( std::regex) Используйте [\s\S]или обходные пути JS ( демо ):regex rex(R"(([\s\S]*)<FooBar>)");
УВАVBScript- Используйте тот же подход, что и в JavaScript ([\s\S]*)<Foobar>. ( Примечание : MultiLineсвойство
RegExpобъекта иногда ошибочно считается вариант , чтобы .матч через разрывы строк, в то время как, на самом деле, он изменяет только ^и $поведение , чтобы соответствовать начало / конец строки , а не строки , так же , как и в JS регулярное выражение ) поведение.)
рТребаза-р- База R регулярных выражений PCRE - использование (?s): regmatches(x, regexec("(?s)(.*)<FooBar>",x, perl=TRUE))[[1]][2]( демо )
рСИСstringrстринги- функции in stringr/ stringiregex, работающие на движке ICU regex, также используют (?s): stringr::str_match(x, "(?s)(.*)<FooBar>")[,2]( demo )
Objective-C- Так же, как Swift, (?s)работает проще всего, но вот как эта опция может быть использована :NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern
options:NSRegularExpressionDotMatchesLineSeparators error:®exError];
В большинстве не POSIX-движков (?s)встроенный модификатор (или опция встроенного флага) может использоваться для принудительного .сопоставления разрывов строк.
Если поместить в начало шаблона, (?s)изменяет поведение всех .в шаблоне. Если(?s) он расположен где-то после начала, .будут затронуты только те , которые расположены справа от него, если только это не шаблон, переданный Python re. В Python re, независимо от (?s)местоположения, .затрагивается весь шаблон . (?s)Эффект перестал использовать (?-s). Модифицированная группа может использоваться, чтобы влиять только на указанный диапазон шаблона регулярного выражения (например Delim1(?s:.*?)\nDelim2.*, первое .*?совпадение будет выполнено через новые строки, а второе .*совпадет только с остальной частью строки).
POSIX примечание :
В не-POSIX регулярных выражениях для соответствия любому символу могут использоваться конструкции [\s\S]/ [\d\D]/ [\w\W].
В POSIX [\s\S]не соответствует ни одному символу (как в JavaScript или любом не-POSIX-движке), потому что escape-последовательности regex не поддерживаются в выражениях в скобках.[\s\S]анализируется как выражения в скобках, которые соответствуют одному символу, \или sили S.
Вы должны дать ссылку на этот отличный обзор со страницы своего профиля или что-то (+1).
Jan
1
Возможно, вы захотите добавить это к элементу boost : в пространстве имен regex_constants, flag_type_'s: perl = ECMAScript = JavaScript = JScript = :: boost :: regbase :: normal = 0, который по умолчанию равен Perl. Программисты установят определение базового флага #define MOD regex_constants::perl | boost::regex::no_mod_s | boost::regex::no_mod_mдля своих флагов регулярных выражений, чтобы отразить это. А арбитор всегда встроенные модификаторы. Где (?-sm)(?s).*сбрасывает.
1
Вы также можете добавить для Баш, пожалуйста?
Пасупати Раджаманикам
2
@PasupathiRajamanickam Bash использует механизм регулярных выражений POSIX, который .соответствует любому символу (включая разрывы строк). Посмотрите это онлайн демо Bash .
Виктор Стрибьев
1
Вы качаетесь - это самый исчерпывающий мини-учебник по (относительно) сложному регулярному выражению, который я когда-либо видел. Вы заслуживаете того, чтобы ваш ответ стал принятым! Слава и дополнительные голоса за включение Goв ответ!
Гвинет Ллевелин
68
Если вы используете поиск Eclipse, вы можете включить опцию "DOTALL", чтобы сделать '.' соответствует любому символу, включая разделители строк: просто добавьте «(? s)» в начале строки поиска. Пример:
По этой ссылке: «JavaScript и VBScript не имеют возможности сделать символы разрыва строки, совпадающие с точкой. В этих языках вы можете использовать класс символов, например [\ s \ S], для соответствия любому символу». Вместо. используйте вместо этого [\ s \ S] (совпадение пробелов и не пробелов).
Аллен
32
([\s\S]*)<FooBar>
Точка соответствует всем кроме новых строк (\ r \ n). Поэтому используйте \ s \ S, который будет соответствовать ВСЕМ символам.
"."обычно не соответствует переводу строки. Большинство движков регулярных выражений позволяет добавлять Sфлаг (также называемый DOTALLи SINGLELINE), чтобы "."также соответствовать символам новой строки. Если это не поможет, вы можете сделать что-то вроде [\S\s].
Похоже, это недопустимо (Chrome): text.match (/ a / s) SyntaxError: Недопустимые флаги, предоставленные конструктору RegExp 's'
Аллен
Потому что это не поддерживается в движках JavaScript RegEx. Эти sфлаги существует в PCRE, наиболее полный двигатель (доступен в Perl и PHP). PCRE имеет 10 флагов (и множество других функций), в то время как JavaScript имеет только 3 флага ( gmi).
Морган Тувери Квиллинг
4
В регулярном выражении на основе Java вы можете использовать [\s\S]
Я полагаю, вы имеете в виду JavaScript, а не Java? Поскольку вы можете просто добавить sфлаг к шаблону в Java, а JavaScript не имеет sфлага.
3limin4t0r
3
Обратите внимание, что это (.|\n)*может быть менее эффективно, чем (например) [\s\S]*(если регулярные выражения вашего языка поддерживают такие экранированные символы), и чем найти способ определения используемого модификатора. также соответствуйте новым строкам. Или вы можете пойти с POSIXy альтернативы, как [[:space:][:^space:]]*.
В контексте использования в языках регулярные выражения действуют на строки, а не на строки. Таким образом, вы сможете нормально использовать регулярные выражения, предполагая, что входная строка имеет несколько строк.
В этом случае данное регулярное выражение будет соответствовать всей строке, поскольку присутствует «<FooBar>». В зависимости от особенностей реализации регулярного выражения, значение $ 1 (полученное из «(. *)») Будет либо «fghij», либо «abcde \ nfghij». Как уже говорили другие, некоторые реализации позволяют вам контролировать, стоит ли "." будет соответствовать новой строке, предоставляя вам выбор.
Использование регулярных выражений на основе строки обычно используется для таких вещей, как egrep.
У меня была та же проблема, и я решил ее, вероятно, не лучшим образом, но она работает. Я заменил все разрывы строк, прежде чем я сделал свой реальный матч:
mystring=Regex.Replace(mystring,"\r\n","")
Я манипулирую HTML, поэтому разрывы строк не имеют для меня большого значения в этом случае.
Я попробовал все предложения выше без удачи, я использую .Net 3.5 FYI
<scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script><buttonid="find_and_replace">Find and replace</button><br><textareaID="textarea">abcde
fghij<Foobar></textarea>
Нет, не делай этого. Если вам нужно сопоставить что-либо, включая разделители строк, используйте модификатор DOTALL (aka / s или SingleLine). Мало того, что взлом (. | \ N) делает регулярное выражение менее эффективным, это даже не правильно. По крайней мере, он должен соответствовать \ r (возврат каретки), а также \ n (перевод строки). Есть и другие символы разделителя строк, хотя они используются редко. Но если вы используете флаг DOTALL, вам не нужно беспокоиться о них.
Алан Мур
1
\ R - независимое от платформы совпадение для новых строк в Eclipse.
Опять
@opyate Вы должны опубликовать это как ответ, так как этот маленький драгоценный камень невероятно полезен.
Джекхарт
Вы можете попробовать это вместо этого. Он не будет соответствовать внутренним скобкам, а также рассмотрит необязательные \r.:((?:.|\r?\n)*)<foobar>
ssc-hrep3
0
Я хотел, чтобы соответствовать конкретный, если блок в Java
......if(isTrue){
doAction();}......}
Если я использую regExp
if \(isTrue(.|\n)*}
он включал закрывающую скобку для блока метода, поэтому я использовал
if \(!isTrue([^}.]|\n)*}
исключить закрывающую скобку из совпадения с подстановочными знаками.
Предположим, что мы хотим изменить значение 81 до некоторого другого значения, скажем, 40. Сначала определите .UID.21..UID., а затем пропустите все символы, в том числе и \nдо .PercentCompleted.. Шаблон регулярного выражения и спецификация замены:
String hw =newString("<TASK>\n <UID>21</UID>\n <Name>Architectural design</Name>\n <PercentComplete>81</PercentComplete>\n</TASK>");String pattern =newString("(<UID>21</UID>)((.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)");String replaceSpec =newString("$1$2$440$6");//note that the group (<PercentComplete>) is $4 and the group ((.|\n)*?) is $2.String iw = hw.replaceFirst(pattern, replaceSpec);System.out.println(iw);<TASK><UID>21</UID><Name>Architectural design</Name><PercentComplete>40</PercentComplete></TASK>
Подгруппа (.|\n), вероятно, является отсутствующей группой $3. Если мы сделаем это без захвата, (?:.|\n)то $3есть (<PercentComplete>). Таким образом, шаблон replaceSpecтакже может быть:
Ответы:
Это зависит от языка, но должен быть модификатор, который вы можете добавить к шаблону регулярных выражений. В PHP это:
Символ s в конце заставляет точку совпадать со всеми символами, включая символы новой строки.
источник
s
модификатор. Вместо этого делайте[^]*
для того же эффекта.m
модификаторПопробуй это:
Это в основном говорит, что «любой символ или перевод строки» повторяется ноль или более раз.
источник
((.|\n|\r)*)<FooBar>
[\s\S]*
или(?s).*
.Вопрос в том, может ли
.
шаблон соответствовать любому персонажу? Ответ варьируется от двигателя к двигателю. Основное различие заключается в том, используется ли шаблон библиотекой регулярных выражений POSIX или не-POSIX.Специальное примечание о Lua-модель: они не считаются регулярными выражениями, но
.
соответствуют любому символу там, так же как и движки на основе POSIX.Еще одна заметка о MATLAB а также октава:
.
соответствует любому символу по умолчанию ( демо ):str = "abcde\n fghij<Foobar>"; expression = '(.*)<Foobar>*'; [tokens,matches] = regexp(str,expression,'tokens','match');
(tokens
содержитabcde\n fghij
элемент).Кроме того, во всех увеличениеПо умолчанию в регулярных выражениях точка соответствует разрывам строк. Boost's ECMAScript грамматика позволяет отключить это с помощью
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 / STRINGI шаблонов, использовать(?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
включает в себя файл slurping,(?s)
включает режим DOTALL для.
шаблона,(?i)
включает режим без учета регистра,\K
пропускает сопоставленный текст до сих пор,*?
является ленивым квантификатором,(?=<Foobar>)
соответствует местоположению ранее<Foobar>
.pcregrep -Mi "(?si)abc\K.*?(?=<Foobar>)" file
(здесьM
включается слежка за файлами). Примечаниеpcregrep
- хорошее решение дляgrep
пользователей Mac OS .Смотрите демоверсии .
Двигатели без 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>)");
УВА VBScript- Используйте тот же подход, что и в JavaScript
([\s\S]*)<Foobar>
. ( Примечание :MultiLine
свойствоRegExp
объекта иногда ошибочно считается вариант , чтобы.
матч через разрывы строк, в то время как, на самом деле, он изменяет только^
и$
поведение , чтобы соответствовать начало / конец строки , а не строки , так же , как и в JS регулярное выражение ) поведение.)Рубин- Использовать модификатор
/m
MULTILINE ( демо ):s[/(.*)<Foobar>/m, 1]
(?s)
:regmatches(x, regexec("(?s)(.*)<FooBar>",x, perl=TRUE))[[1]][2]
( демо )stringr
/stringi
regex, работающие на движке ICU regex, также используют(?s)
:stringr::str_match(x, "(?s)(.*)<FooBar>")[,2]
( demo )(?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)
он расположен где-то после начала,.
будут затронуты только те , которые расположены справа от него, если только это не шаблон, переданный Pythonre
. В Pythonre
, независимо от(?s)
местоположения,.
затрагивается весь шаблон .(?s)
Эффект перестал использовать(?-s)
. Модифицированная группа может использоваться, чтобы влиять только на указанный диапазон шаблона регулярного выражения (напримерDelim1(?s:.*?)\nDelim2.*
, первое.*?
совпадение будет выполнено через новые строки, а второе.*
совпадет только с остальной частью строки).POSIX примечание :
В не-POSIX регулярных выражениях для соответствия любому символу могут использоваться конструкции
[\s\S]
/[\d\D]
/[\w\W]
.В POSIX
[\s\S]
не соответствует ни одному символу (как в JavaScript или любом не-POSIX-движке), потому что escape-последовательности regex не поддерживаются в выражениях в скобках.[\s\S]
анализируется как выражения в скобках, которые соответствуют одному символу,\
илиs
илиS
.источник
#define MOD regex_constants::perl | boost::regex::no_mod_s | boost::regex::no_mod_m
для своих флагов регулярных выражений, чтобы отразить это. А арбитор всегда встроенные модификаторы. Где(?-sm)(?s).*
сбрасывает..
соответствует любому символу (включая разрывы строк). Посмотрите это онлайн демо Bash .Go
в ответ!Если вы используете поиск Eclipse, вы можете включить опцию "DOTALL", чтобы сделать '.' соответствует любому символу, включая разделители строк: просто добавьте «(? s)» в начале строки поиска. Пример:
источник
(?s)
=>(?m)
Во многих диалектах регулярных выражений
/[\S\s]*<Foobar>/
будет делать то, что вы хотите. Источникисточник
([\s\S]*)<FooBar>
Точка соответствует всем кроме новых строк (\ r \ n). Поэтому используйте \ s \ S, который будет соответствовать ВСЕМ символам.
источник
[text rangeOfString:regEx options:NSRegularExpressionSearch]
. Спасибо!<FooBar>
В рубине РубинВы можете использовать
m
опцию ' ' (многострочный):См. Документацию Regexp на ruby-doc.org для получения дополнительной информации.
источник
мы также можем использовать
чтобы соответствовать всем, включая перевод строки без жадных
Это сделает новую строку необязательной
источник
"."
обычно не соответствует переводу строки. Большинство движков регулярных выражений позволяет добавлятьS
флаг (также называемыйDOTALL
иSINGLELINE
), чтобы"."
также соответствовать символам новой строки. Если это не поможет, вы можете сделать что-то вроде[\S\s]
.источник
Для Eclipse сработало следующее выражение:
Регулярные выражения:
источник
s приводит к тому, что точка (.) совпадает с возвратом каретки
источник
s
флаги существует в PCRE, наиболее полный двигатель (доступен в Perl и PHP). PCRE имеет 10 флагов (и множество других функций), в то время как JavaScript имеет только 3 флага (gmi
).В регулярном выражении на основе Java вы можете использовать
[\s\S]
источник
s
флаг к шаблону в Java, а JavaScript не имеетs
флага.Обратите внимание, что это
(.|\n)*
может быть менее эффективно, чем (например)[\s\S]*
(если регулярные выражения вашего языка поддерживают такие экранированные символы), и чем найти способ определения используемого модификатора. также соответствуйте новым строкам. Или вы можете пойти с POSIXy альтернативы, как[[:space:][:^space:]]*
.источник
Используйте RegexOptions.Singleline, это меняет значение. включить переводы строки
Regex.Replace (content, searchText, replaceText, RegexOptions.Singleline);
источник
Решение:
Используйте модификатор шаблона sU, чтобы получить желаемое совпадение в PHP.
пример:
Источник:
http://dreamluverz.com/developers-tools/regex-match-all-inclusive-new-line http://php.net/manual/en/reference.pcre.pattern.modifiers.php
источник
В контексте использования в языках регулярные выражения действуют на строки, а не на строки. Таким образом, вы сможете нормально использовать регулярные выражения, предполагая, что входная строка имеет несколько строк.
В этом случае данное регулярное выражение будет соответствовать всей строке, поскольку присутствует «<FooBar>». В зависимости от особенностей реализации регулярного выражения, значение $ 1 (полученное из «(. *)») Будет либо «fghij», либо «abcde \ nfghij». Как уже говорили другие, некоторые реализации позволяют вам контролировать, стоит ли "." будет соответствовать новой строке, предоставляя вам выбор.
Использование регулярных выражений на основе строки обычно используется для таких вещей, как egrep.
источник
У меня была та же проблема, и я решил ее, вероятно, не лучшим образом, но она работает. Я заменил все разрывы строк, прежде чем я сделал свой реальный матч:
Я манипулирую HTML, поэтому разрывы строк не имеют для меня большого значения в этом случае.
Я попробовал все предложения выше без удачи, я использую .Net 3.5 FYI
источник
(\s|\S)
кажется, добился цели!(?s)
для.
сопоставления любых символов. Не используйте(\s|\S)
это замедлит производительность.В Javascript вы можете использовать [^] * для поиска от нуля до бесконечных символов, включая разрывы строк.
источник
в общем . не соответствует переводу строки, поэтому попробуйте
((.|\n)*)<foobar>
источник
\r
.:((?:.|\r?\n)*)<foobar>
Я хотел, чтобы соответствовать конкретный, если блок в Java
Если я использую regExp
он включал закрывающую скобку для блока метода, поэтому я использовал
исключить закрывающую скобку из совпадения с подстановочными знаками.
источник
Часто нам приходится изменять подстроку с несколькими ключевыми словами, разбросанными по строкам, предшествующим подстроке. Рассмотрим элемент xml:
Предположим, что мы хотим изменить значение 81 до некоторого другого значения, скажем, 40. Сначала определите
.UID.21..UID.
, а затем пропустите все символы, в том числе и\n
до.PercentCompleted.
. Шаблон регулярного выражения и спецификация замены:Подгруппа
(.|\n)
, вероятно, является отсутствующей группой$3
. Если мы сделаем это без захвата,(?:.|\n)
то$3
есть(<PercentComplete>)
. Таким образом, шаблонreplaceSpec
также может быть:и замена работает правильно, как и раньше.
источник
Обычно при поиске трех последовательных строк в Powershell это выглядит так:
Как ни странно, это будет текст UNIX в приглашении, но текст Windows в файле:
Вот способ распечатать окончания строк:
источник
Опция 1
Один из способов - использовать
s
флаг (так же, как принятый ответ):Демо 1
Вариант 2
Второй способ - использовать
m
флаг (многострочный) и любой из следующих шаблонов:или
или
Демо 2
RegEx Circuit
jex.im визуализирует регулярные выражения:
источник