Regex für jedes Zeichen, einschließlich neuer Zeilen

223

Gibt es einen regulären Ausdruck, der "allen Zeichen einschließlich Zeilenumbrüchen" entspricht?

Im regulären Ausdruck gibt es beispielsweise keine Ausgabe von, $2da (.+?)beim Abgleichen keine neuen Zeilen enthalten sind.

$string = "START Curabitur mollis, dolor ut rutrum consequat, arcu nisl ultrices diam, adipiscing aliquam ipsum metus id velit. Aenean vestibulum gravida felis, quis bibendum nisl euismod ut. 

Nunc at orci sed quam pharetra congue. Nulla a justo vitae diam eleifend dictum. Maecenas egestas ipsum elementum dui sollicitudin tempus. Donec bibendum cursus nisi, vitae convallis ante ornare a. Curabitur libero lorem, semper sit amet cursus at, cursus id purus. Cras varius metus eu diam vulputate vel elementum mauris tempor. 

Morbi tristique interdum libero, eu pulvinar elit fringilla vel. Curabitur fringilla bibendum urna, ullamcorper placerat quam fermentum id. Nunc aliquam, nunc sit amet bibendum lacinia, magna massa auctor enim, nec dictum sapien eros in arcu. 

Pellentesque viverra ullamcorper lectus, a facilisis ipsum tempus et. Nulla mi enim, interdum at imperdiet eget, bibendum nec END";

$string =~ /(START)(.+?)(END)/;

print $2;
kurotsuki
quelle
1
Vielleicht möchten Sie über Regex-Modifikatoren / Flags lesen wie: m, s (m / Regex / ims ...)
Snoofkin

Antworten:

194

Fügen Sie den sModifikator zu Ihrer Regex hinzu, damit die .Zeilenumbrüche übereinstimmen:

$string =~ /(START)(.+?)(END)/s;
BoltClock
quelle
32
In JavaScript: (START) [\ s \ S] * (ENDE) - Siehe www.regexpal.com zum Testen
Zymotik
1
Weitere Informationen zu @ Zymotiks Kommentar finden Sie unter: stackoverflow.com/questions/1068280/…
Jacob van Lingen
2
In Java können Sie die Inline-Modifikatoren am Anfang des regulären Ausdrucks verwenden, um beispielsweise alle Zeichen einschließlich Zeilenumbrüchen nach der Verwendung von 'yourPattern' zu ersetzen. "(?s)yourPattern.*"Siehe auch: rexegg.com/regex-modifiers.html#dotall
LukeSolar
In Ruby ist der Modifikator mnicht s. Siehe: rubular.com
Jon Schneider
312

Wenn Sie den /sRegex-Modifikator nicht hinzufügen möchten (möglicherweise möchten Sie .seine ursprüngliche Bedeutung an anderer Stelle im Regex beibehalten), können Sie auch eine Zeichenklasse verwenden. Eine Möglichkeit:

[\S\s]

ein Zeichen, das kein Raum oder ein Raum ist. Mit anderen Worten, jedes Zeichen.

Sie können Modifikatoren auch lokal in einem kleinen Teil des regulären Ausdrucks ändern, wie folgt:

(?s:.)
kurzlebig
quelle
2
+1 Ich wollte gerade (?s:.)selbst mit der Syntax arbeiten.
BoltClock
Ist (?:.|\n)in irgendeiner Weise minderwertig, außer weniger elegant zu sein?
Vlastimil Ovčáčík
([\S\s]+)ist das, wonach ich gesucht habe. Vielen Dank. +1
Ryan
@ VlastimilOvčáčík Das kann für die Laufzeit sehr schlecht sein, wenn Sie es mit verwenden *oder +da es 2 ^ n verschiedene Möglichkeiten gibt, kann es mit einer bestimmten Zeichenfolge der Länge n übereinstimmen.
Radon Rosborough
8

Ja, Sie müssen nur eine .neue Zeile erstellen:

$string =~ /(START)(.+?)(END)/s;
FailedDev
quelle
-5

Sie möchten "mehrzeilig" verwenden.

$string =~ /(START)(.+?)(END)/m;
Nadime
quelle
6
Nein, mwirkt sich auf die ^und $Anker aus, aber nicht ..
BoltClock
Interessant, danke. Ich glaube, ich habe nie versucht, genau das zu tun, was das OP verlangt.
Nadime