20 ответов:
Это зависит от языка, но должен быть модификатор, который можно добавить в шаблон регулярного выражения. В PHP:
/(.*)<FooBar>/sна s в конце вызывает точку, чтобы соответствовать все символы, включая переводы строк.
попробуйте это:
((.|\n)*)<FooBar>он в основном говорит "любой символ или новая строка" повторяется ноль или более раз.
Если вы используете Eclipse search, вы можете включить опцию "DOTALL", чтобы сделать '.'сопоставьте любой символ, включая разделители строк: просто добавьте "(?С)" в начале строки поиска. Пример:
(?s).*<FooBar>
вопрос в том, может
.рисунок любой персонаж? Ответ варьируется от двигателя к двигателю. Основное различие заключается в том, используется ли шаблон библиотекой регулярных выражений POSIX или non-POSIX.специальное примечание о lua-patterns: они не считаются регулярными выражениями, но
.соответствует любому символу там, так же, как двигатели на основе POSIX.еще одна заметка на matlab и октавы: в
.соответствует любому символу по умолчанию (demo):str = "abcde\n fghij<Foobar>"; expression = '(.*)<Foobar>*'; [tokens,matches] = regexp(str,expression,'tokens','match');(tokensсодержатabcde\n fghijноменклатура).кроме того, во всех boostрегулярное выражение грамматики точка соответствует разрывы строк по умолчанию. Грамматика ECMAScript Boost позволяет отключить это с помощью
regex_constants::no_mod_m(источник).как oracle (он основан на POSIX), используйте
nопции (demo):select regexp_substr('abcde' || chr(10) ||' fghij<Foobar>', '(.*)<Foobar>', 1, 1, 'n', 1) as results from dualдвигатели на основе POSIX:
tcl (demo),postgresql (demo), r (TRE, базовый двигатель R по умолчанию без
perl=TRUE, для базы R сperl=TRUEили stringr/ stringi шаблоны, используйте(?s)встроенный модификатор) (demo). Просто.уже соответствует разрывам строк, не нужно использовать какие-либо модификаторы.двигатели, не основанные на POSIX:
- php - используйте
sмодификатор модификатор PCRE_DOTALL:preg_match('~(.*)<Foobar>~s', $s, $m)(demo)- c# - используйте
RegexOptions.Singlelineфлаг (demo):
-var result = Regex.Match(s, @"(.*)<Foobar>", RegexOptions.Singleline).Groups[1].Value;
-var result = Regex.Match(s, @"(?s)(.*)<Foobar>").Groups[1].Value;- powershell - используйте рядный :
$s = "abcde`nfghij<FooBar>"; $s -match "(?s)(.*)<Foobar>"; $matches[1]- perl - используйте
sмодификатор (или(?s)встроенная версия в начале) (demo):/(.*)<FooBar>/s- python - используйте
re.DOTALL(илиre.S) флаги или(?s)встроенный модификатор (demo):m = re.search(r"(.*)<FooBar>", s, flags=re.S)(затемif m:,print(m.group(1)))- java - используйте
Pattern.DOTALLмодификатор (или inline(?s)флаг) (demo):Pattern.compile("(.*)<FooBar>", Pattern.DOTALL)- в Groovy - используйте
(?s)модификатор in-pattern (demo):regex = /(?s)(.*)<FooBar>/- scala - используйте
(?s)модификатор (demo):"(?s)(.*)<Foobar>".r.findAllIn("abcde\n fghij<Foobar>").matchData foreach { m => println(m.group(1)) }- javascript - используйте
[^]или обходные пути[\d\D]/[\w\W]/[\s\S](demo):s.match(/([\s\S]*)<FooBar>/)[1]- c++ (
std::regex) использовать[\s\S]или обходные пути JS (demo):regex rex(R"(([\s\S]*)<FooBar>)");- vba - используйте тот же подход, что и в JavaScript,
([\s\S]*)<Foobar>.- Рубин - используйте
/mMULTILINE модификатор (demo):s[/(.*)<Foobar>/m, 1]go - использовать модификатор inline
(?s)в начале (demo):re: = regexp.MustCompile(`(?s)(.*)<FooBar>`)- swift - использовать
dotMatchesLineSeparatorsили (проще) пройти(?s)встроенный модификатор к шаблону:let rx = "(?s)(.*)<Foobar>"- с - то же, что и Свифт,
(?s)работает проще всего, но вот как то опция может быть использована:NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionDotMatchesLineSeparators error:®exError];- re2,
google-apps-script - используйте
(?s)модификатор (demo):"(?s)(.*)<Foobar>"(в электронных таблицах Google,=REGEXEXTRACT(A2,"(?s)(.*)<Foobar>"))ПРИМЕЧАНИЯ
(?s):в большинстве двигателей без POSIX,
(?s)встроенный модификатор (или опция встроенного флага) может использоваться для принудительного применения.чтобы соответствовать разрывы строк.если поместить в начале шаблона,
(?s)изменяет bahavior всех.в шаблоне. Если(?s)помещается где-то после начала, только те.будут затронуты, которые находятся справа от него если это шаблон, переданный Pythonre. В Pythonreнезависимо от(?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, который будет соответствовать всем символам.
на РубинРубин вы можете использовать '' (многоканальный):
/YOUR_REGEXP/mпосмотреть в документации по регулярным выражениям on ruby-doc.org для получения дополнительной информации.
"."обычно не соответствует разрывам строк. Большинство движков регулярных выражений позволяет добавитьS-флаг (также называемыйDOTALLиSINGLELINE), чтобы сделать"."совпадающие строки. Если это не удается, вы можете сделать что-то вроде[\S\s].
для Eclipse работало следующее выражение:
Foo
бар jadajada"
Регулярных Выражений:
Foo[\S\s]{1,10}.*Bar*
мы также можем использовать
(.*?\n)*?чтобы соответствовать все, включая новую строку без жадных
это сделает новую строку необязательной
(.*?|\n)*?
отметим, что
(.|\n)*может быть менее эффективным, чем (например)[\s\S]*(если регулярные выражения вашего языка поддерживают такие экранирования) и чем найти, как указать модификатор, который делает . также совпадают новые строки. Или вы можете пойти с альтернативами POSIXy, такими как[[:space:][:^space:]]*.
Использовать Регулярные Выражения.Однострочный, это меняет смысл . чтобы включить новые строки
регулярное выражение.Replace (content, searchText, replaceText, RegexOptions.Однострочный);
устранение:
использование модификатора шаблона sU получит желаемое соответствие в PHP.
пример:
preg_match('/(.*)/sU',$content,$match);источник:
http://dreamluverz.com/developers-tools/regex-match-all-including-new-line http://php.net/manual/en/reference.pcre.pattern.modifiers.php
в контексте использования в языках регулярные выражения действуют на строки, а не на строки. Таким образом, вы должны иметь возможность использовать регулярное выражение обычно, предполагая, что входная строка имеет несколько строк.
в этом случае данное регулярное выражение будет соответствовать всей строке, так как "
" присутствует. В зависимости от специфики реализации регулярного выражения, значение $1 (полученное из "(.* ) ") будет либо "fghij", либо"abcde\nfghij". Как уже говорили другие, некоторые реализации позволяют контролировать ли то"."будет соответствовать новой линии, давая вам выбор. линия на основе регулярного употребления выражения, как правило, для командной строки вещи, как для egrep.
У меня была та же проблема, и я решил ее, вероятно, не лучшим образом, но это работает. Я заменил все разрывы линий, прежде чем я сделал свой реальный матч:
mystring= Regex.Replace(mystring, "\r\n", "")Я манипулирую HTML, поэтому разрывы строк не имеют для меня особого значения в этом случае.
Я пробовал все предложения выше, не повезло, я использую .Net 3.5 FYI
Я хотел бы соответствовать конкретному блоку if в java
... ... if(isTrue){ doAction(); } ... ... }Если я использую регулярное выражение
if \(isTrue(.|\n)*}он включал закрывающую скобку для блока метода, поэтому я использовал
if \(!isTrue([^}.]|\n)*}чтобы исключить закрывающую скобку из подстановочного соответствия.
часто нам приходится изменять подстроку с несколькими ключевыми словами, разбросанными по строкам, предшествующим подстроке. Рассмотрим xml-элемент:
<TASK> <UID>21</UID> <Name>Architectural design</Name> <PercentComplete>81</PercentComplete> </TASK>предположим, что мы хотим изменить 81, к некоторому другому значению, скажем 40. Во-первых, определить
.UID.21..UID., затем пропустите все символы, включая\nдо.PercentCompleted.. Шаблон регулярного выражения и спецификация замены:String hw = new String("<TASK>\n <UID>21</UID>\n <Name>Architectural design</Name>\n <PercentComplete>81</PercentComplete>\n</TASK>"); String pattern = new String ("(<UID>21</UID>)((.|\n)*?)(<PercentComplete>)(\d+)(</PercentComplete>)"); String replaceSpec = new String ("0"); //note that the group (<PercentComplete>) is and the group ((.|\n)*?) is . String iw = hw.replaceFirst(pattern, replaceSpec); System.out.println(iw); <TASK> <UID>21</UID> <Name>Architectural design</Name> <PercentComplete>40</PercentComplete> </TASK>подгруппа
(.|\n)вероятно, отсутствует группа. Если мы сделаем это не захватывается(?:.|\n)тути(<PercentComplete>). Так что выкройка иreplaceSpecможно:pattern = new String("(<UID>21</UID>)((?:.|\n)*?)(<PercentComplete>)(\d+)(</PercentComplete>)"); replaceSpec = new String("0")и замена работает правильно, как и раньше.
go
google-apps-script
Comments