Wie kann ich ein Zeichen in einem regulären Ausdruck über mehrere Zeilen hinweg abgleichen?

356

Zum Beispiel diese Regex

(.*)<FooBar>

Wird zusammenpassen:

abcde<FooBar>

Aber wie kann ich erreichen, dass es über mehrere Zeilen hinweg übereinstimmt?

abcde
fghij<FooBar>
andyuk
quelle
1
Zu klären; Ich habe ursprünglich Eclipse verwendet, um in mehreren Dateien zu suchen und zu ersetzen. Was ich durch die Antworten unten entdeckt habe, ist, dass mein Problem das Werkzeug und nicht das Regex-Muster war.
Andyuk
2
Ihr Flag "Eclipse" sollte dann entfernt werden, da jemand, der nach einer Eclipse-Lösung sucht, diese Frage findet (wie ich) und dann eine Nicht-Eclipse-Lösung als akzeptierte findet.
Acme
2
Jetzt finde ich das in der Suchmaschine, weil Eclipse erwähnt wurde. Oh das Grauen.
Brian Olsen

Antworten:

240

Dies hängt von der Sprache ab, es sollte jedoch einen Modifikator geben, den Sie dem Regex-Muster hinzufügen können. In PHP ist es:

/(.*)<FooBar>/s

Das s am Ende bewirkt, dass der Punkt mit allen Zeichen einschließlich Zeilenumbrüchen übereinstimmt.

Jeremy Ruten
quelle
und was wäre, wenn ich nur eine neue Zeile und nicht alle Zeichen wollte?
Grace
3
@Grace: Verwenden Sie \ n, um eine neue Zeile zu finden
Jeremy Ruten
5
Das s-Flag ist (jetzt?) Ungültig, zumindest in Chrome / V8. Verwenden Sie stattdessen / ([\ s \ S] *) <FooBar> / Zeichenklasse (Übereinstimmungsbereich und Nicht-Leerzeichen) anstelle des Perioden-Matchers. Weitere Informationen finden Sie in anderen Antworten.
Allen
8
@Allen - JavaScript unterstützt den sModifikator nicht. Führen Sie stattdessen [^]*den gleichen Effekt aus.
Derek 12 會 功夫
1
Verwenden Sie in Ruby den mModifikator
Ryan Buckley
358

Versuche dies:

((.|\n)*)<FooBar>

Grundsätzlich heißt es "jedes Zeichen oder eine neue Zeile" und wird null oder mehrmals wiederholt.

Levik
quelle
5
Dies hängt von der Sprache und / oder dem Werkzeug ab, das Sie verwenden. Bitte teilen Sie uns mit, was Sie verwenden, z. B. Perl, PHP, CF, C #, sed, awk usw.
Ben Doom
39
Abhängig von Ihren Zeilenenden benötigen Sie möglicherweise((.|\n|\r)*)<FooBar>
Potherca
3
Er sagte, er benutze Eclipse. Dies ist meiner Meinung nach die richtige Lösung. Ich habe das gleiche Problem und das hat es gelöst.
Donau Seemann
4
Richtig - die Frage betrifft Eclipse und die Tags auch. Die akzeptierte Lösung ist jedoch eine PHP-Lösung. Ihre sollte die akzeptierte Lösung sein ...
Acme
16
Dies ist der schlechteste reguläre Ausdruck für die Übereinstimmung mehrerer Zeileneingaben. Bitte verwenden Sie es niemals, es sei denn, Sie verwenden ElasticSearch. Verwenden Sie [\s\S]*oder (?s).*.
Wiktor Stribiżew
88

Die Frage ist, kann das .Muster mit jedem Zeichen übereinstimmen ? Die Antwort variiert von Motor zu Motor. Der Hauptunterschied besteht darin, ob das Muster von einer POSIX- oder einer Nicht-POSIX-Regex-Bibliothek verwendet wird.

Besonderer Hinweis zu : Sie werden nicht als reguläre Ausdrücke betrachtet, .stimmen jedoch mit allen Zeichen überein, genau wie POSIX-basierte Engines.

Noch ein Hinweis zu und : Das .entspricht standardmäßig jedem Zeichen ( Demo ): str = "abcde\n fghij<Foobar>"; expression = '(.*)<Foobar>*'; [tokens,matches] = regexp(str,expression,'tokens','match');( tokensenthält ein abcde\n fghijElement).

Auch in allen Bei den Regex-Grammatiken stimmt der Punkt standardmäßig mit Zeilenumbrüchen überein. Mit der ECMAScript-Grammatik von Boost können Sie dies mit regex_constants::no_mod_m( Quelle ) deaktivieren .

Wie für (es basiert auf POSIX), verwenden Sie die nOption ( Demo ):select regexp_substr('abcde' || chr(10) ||' fghij<Foobar>', '(.*)<Foobar>', 1, 1, 'n', 1) as results from dual

POSIX-basierte Engines :

Ein bloßes entspricht .bereits Zeilenumbrüchen, es müssen keine Modifikatoren verwendet werden, siehe( Demo ).

Das ( Demo ),( Demo ),(TRE, Basis-R-Standard-Engine mit Nein perl=TRUE, für Basis-R mit perl=TRUEoder für Stringr / Stringi- Muster verwenden Sie den (?s)Inline-Modifikator.) ( Demo ) Behandeln Sie dies ebenfalls auf .die gleiche Weise.

Die meisten POSIX-basierten Tools verarbeiten Eingaben jedoch zeilenweise. Entspricht .daher nicht den Zeilenumbrüchen, nur weil sie nicht im Geltungsbereich liegen. Hier einige Beispiele, wie Sie dies überschreiben können:

  • - Es gibt mehrere Problemumgehungen. Die genaueste, aber nicht sehr sichere ist sed 'H;1h;$!d;x; s/\(.*\)><Foobar>/\1/'( H;1h;$!d;x;schlürft die Datei in den Speicher). Wenn ganze Zeilen enthalten sein müssen sed '/start_pattern/,/end_pattern/d' file(das Entfernen vom Anfang endet mit übereinstimmenden Zeilen) oder sed '/start_pattern/,/end_pattern/{{//!d;};}' file(ohne übereinstimmende übereinstimmende Zeilen) kann berücksichtigt werden.
  • - perl -0pe 's/(.*)<FooBar>/$1/gs' <<< "$str"( -0schlürft die gesamte Datei in den Speicher, -pdruckt die Datei nach Anwendung des von -e). Beachten Sie, dass bei Verwendung -000pedie Datei verschluckt \n\nund der Absatzmodus aktiviert wird, in dem Perl aufeinanderfolgende Zeilenumbrüche ( ) als Datensatztrennzeichen verwendet.
  • - grep -Poz '(?si)abc\K.*?(?=<Foobar>)' file. Aktiviert hier zdas Schlürfen von Dateien, (?s)aktiviert den DOTALL-Modus für das .Muster, aktiviert den Modus ohne Berücksichtigung der (?i)Groß- und Kleinschreibung, \Klässt den bisher übereinstimmenden Text weg, *?ist ein fauler Quantifizierer, (?=<Foobar>)stimmt mit dem vorherigen Speicherort überein <Foobar>.
  • - pcregrep -Mi "(?si)abc\K.*?(?=<Foobar>)" file( Maktiviert hier das Schlürfen von Dateien). Hinweis pcregrepist eine gute Lösung für Mac OS- grepBenutzer.

Siehe Demos .

Nicht POSIX-basierte Engines :

  • - Verwenden Sie den sModifikator PCRE_DOTALL Modifikator : preg_match('~(.*)<Foobar>~s', $s, $m)( Demo )
  • - RegexOptions.SinglelineFlag ( Demo ) verwenden:
    - var result = Regex.Match(s, @"(.*)<Foobar>", RegexOptions.Singleline).Groups[1].Value;
    -var result = Regex.Match(s, @"(?s)(.*)<Foobar>").Groups[1].Value;
  • - (?s)Inline-Option verwenden:$s = "abcde`nfghij<FooBar>"; $s -match "(?s)(.*)<Foobar>"; $matches[1]
  • - Verwenden Sie den sModifikator (oder die (?s)Inline-Version zu Beginn) ( Demo ):/(.*)<FooBar>/s
  • - Verwenden Sie re.DOTALL(oder re.S) Fahnen oder (?s)Inline - Modifikator ( Demo ): m = re.search(r"(.*)<FooBar>", s, flags=re.S)(und dann if m:, print(m.group(1)))
  • - Verwenden Sie den Pattern.DOTALLModifikator (oder das Inline- (?s)Flag) ( Demo ):Pattern.compile("(.*)<FooBar>", Pattern.DOTALL)
  • - Verwenden Sie den (?s)In-Pattern-Modifikator ( Demo ):regex = /(?s)(.*)<FooBar>/
  • - (?s)Modifikator ( Demo ) verwenden:"(?s)(.*)<Foobar>".r.findAllIn("abcde\n fghij<Foobar>").matchData foreach { m => println(m.group(1)) }
  • - Verwendung [^]oder Problemumgehung [\d\D]/ [\w\W]/ [\s\S]( Demo ):s.match(/([\s\S]*)<FooBar>/)[1]
  • ( std::regex) Verwenden Sie [\s\S]oder die JS-Problemumgehungen ( Demo ):regex rex(R"(([\s\S]*)<FooBar>)");
  • - Verwenden Sie den gleichen Ansatz wie in JavaScript ([\s\S]*)<Foobar>. ( HINWEIS : Die MultiLineEigenschaft des RegExpObjekts wird manchmal fälschlicherweise als die Option angesehen, .Übereinstimmungen über Zeilenumbrüche hinweg zuzulassen , während tatsächlich nur das Verhalten ^und das $Verhalten so geändert werden, dass es mit dem Anfang / Ende von Zeilen und nicht mit Zeichenfolgen übereinstimmt , wie in JS-Regex ) Verhalten.)

  • - Verwenden /m Sie den Modifikator MULTILINE ( Demo ):s[/(.*)<Foobar>/m, 1]

  • - Regexps von Base R PCRE - Verwendung (?s): regmatches(x, regexec("(?s)(.*)<FooBar>",x, perl=TRUE))[[1]][2]( Demo )
  • - In stringr/ stringiRegex-Funktionen, die mit der ICU-Regex-Engine betrieben werden, verwenden außerdem (?s): stringr::str_match(x, "(?s)(.*)<FooBar>")[,2]( Demo )
  • - Verwenden Sie (?s)zu Beginn den Inline-Modifikator ( Demo ):re: = regexp.MustCompile(`(?s)(.*)<FooBar>`)
  • - Verwenden Sie dotMatchesLineSeparatorsden (?s)Inline-Modifikator oder übergeben Sie ihn (einfacher) an das Muster:let rx = "(?s)(.*)<Foobar>"
  • - Wie Swift (?s)funktioniert am einfachsten, aber hier ist, wie die Option verwendet werden kann :NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionDotMatchesLineSeparators error:&regexError];
  • , - Verwenden Sie den (?s)Modifikator ( Demo ): "(?s)(.*)<Foobar>"(in Google Spreadsheets, =REGEXEXTRACT(A2,"(?s)(.*)<Foobar>"))

ANMERKUNGEN ZU(?s) :

In den meisten Nicht-POSIX-Engines kann der (?s)Inline-Modifikator (oder die eingebettete Flag-Option) verwendet werden, um zu erzwingen ., dass Zeilenumbrüche übereinstimmen.

Wenn es am Anfang des Musters platziert wird, (?s)ändert sich das Verhalten aller .im Muster. Wenn das (?s)irgendwo nach dem Anfang platziert wird, sind nur diejenigen .betroffen, die sich rechts davon befinden, es sei denn, dies ist ein an Python übergebenes Muster re. In Python reist unabhängig vom (?s)Speicherort das gesamte Muster .betroffen. Der (?s)Effekt wird mit beendet (?-s). Eine geänderte Gruppe kann verwendet werden, um nur einen bestimmten Bereich eines Regex-Musters zu beeinflussen (z. B. Delim1(?s:.*?)\nDelim2.*wird die erste .*?Übereinstimmung über Zeilenumbrüche hinweg und die zweite .*nur mit dem Rest der Zeile übereinstimmen).

POSIX Hinweis :

In nicht-POSIX regex Motoren passen jede char, [\s\S]/ [\d\D]/ [\w\W]Konstrukte verwendet werden können.

Entspricht in POSIX [\s\S]keinem Zeichen (wie in JavaScript oder einer Nicht-POSIX-Engine), da Regex-Escape-Sequenzen in Klammerausdrücken nicht unterstützt werden. [\s\S]wird als Klammerausdrücke analysiert, die einem einzelnen Zeichen entsprechen, \oder soder S.

Wiktor Stribiżew
quelle
5
Sie sollten von Ihrer Profilseite oder etwas anderem (+1) auf diese hervorragende Übersicht verlinken.
Januar
1
Möglicherweise möchten Sie dies dem Boost- Element hinzufügen : Im Namespace regex_constants ist flag_type_s: perl = ECMAScript = JavaScript = JScript = :: boost :: regbase :: normal = 0, standardmäßig Perl. Programmierer legen eine Basis-Flag-Definition #define MOD regex_constants::perl | boost::regex::no_mod_s | boost::regex::no_mod_mfür ihre Regex-Flags fest, um dies widerzuspiegeln. Und der Schiedsrichter ist immer der Inline-Modifikator. Wo (?-sm)(?s).*zurückgesetzt.
1
Können Sie bitte auch für Bash hinzufügen?
Pasupathi Rajamanickam
2
@PasupathiRajamanickam Bash verwendet eine POSIX-Regex-Engine, die .mit jedem Zeichen dort übereinstimmt (einschließlich Zeilenumbrüchen). Sehen Sie sich diese Online-Bash-Demo an .
Wiktor Stribiżew
1
Du rockst - dies ist das umfassendste Mini-Tutorial zu (relativ) komplexen regulären Ausdrücken, das ich je gesehen habe. Sie haben es verdient, dass Ihre Antwort akzeptiert wird! Ein großes Lob und zusätzliche Stimmen für die Aufnahme Goin die Antwort!
Gwyneth Llewelyn
68

Wenn Sie die Eclipse-Suche verwenden, können Sie die Option "DOTALL" aktivieren, um '.' stimmen mit jedem Zeichen überein, einschließlich Zeilenbegrenzern: Fügen Sie einfach "(? s)" am Anfang Ihrer Suchzeichenfolge hinzu. Beispiel:

(?s).*<FooBar>
Paulo Merson
quelle
1
Nicht irgendwo, nur in Regex-Geschmacksrichtungen, die Inline-Modifikatoren unterstützen, und schon gar nicht in Ruby, wo (?s)=>(?m)
Wiktor Stribiżew
Irgendwas für Bash?
Pasupathi Rajamanickam
38

In vielen Regex-Dialekten /[\S\s]*<Foobar>/wird genau das getan, was Sie wollen. Quelle

Abbas Shahzadeh
quelle
2
Über diesen Link: "JavaScript und VBScript haben keine Option, um die Punkte mit Zeilenumbrüchen abzugleichen. In diesen Sprachen können Sie eine Zeichenklasse wie [\ s \ S] verwenden, um mit einem beliebigen Zeichen übereinzustimmen." Anstatt der . Verwenden Sie stattdessen [\ s \ S] (Leerzeichen und Nicht-Leerzeichen abgleichen).
Allen
32

([\s\S]*)<FooBar>

Der Punkt stimmt mit allen außer Zeilenumbrüchen (\ r \ n) überein. Verwenden Sie also \ s \ S, das ALLEN Zeichen entspricht.

Samwize
quelle
Dies löst das Problem, wenn Sie das Objective-C verwenden [text rangeOfString:regEx options:NSRegularExpressionSearch]. Vielen Dank!
J. Costa
1
Dies funktioniert in IntelliJs Regex zum Suchen und Ersetzen, danke.
Barclay
Das funktioniert. Aber es muss das erste Auftreten von<FooBar>
Ozkan
18

In Ruby Sie können die mOption ' ' (mehrzeilig) verwenden:

/YOUR_REGEXP/m

Weitere Informationen finden Sie in der Regexp-Dokumentation auf ruby-doc.org.

Vibaiher
quelle
13

wir können auch verwenden

(.*?\n)*?

um alles zusammenzubringen, einschließlich Newline ohne Gier

Dadurch wird die neue Zeile optional

(.*?|\n)*?
Nambi_0915
quelle
8

"."passt normalerweise nicht zu Zeilenumbrüchen. Bei den meisten Regex-Engines können Sie das SFlag (auch DOTALLund genannt SINGLELINE) hinzufügen , damit "."auch Zeilenumbrüche übereinstimmen. Wenn das fehlschlägt, können Sie so etwas tun [\S\s].

Markus Jarderot
quelle
8

Für Eclipse funktionierte folgender Ausdruck:

Foo

Jadajada Bar "

Regulären Ausdruck:

Foo[\S\s]{1,10}.*Bar*
Gordon
quelle
5
/(.*)<FooBar>/s

Das s bewirkt, dass Dot (.) mit den Wagenrückläufen übereinstimmt

Rechnung
quelle
Scheint so, als wäre dies ungültig (Chrome): text.match (/ a / s) SyntaxError: Ungültige Flags, die an RegExp-Konstruktoren geliefert wurden
Allen
Weil es in JavaScript RegEx-Engines nicht unterstützt wird. Die sFlags sind in PCRE vorhanden, der vollständigsten Engine (verfügbar in Perl und PHP). PCRE hat 10 Flags (und viele andere Funktionen), während JavaScript nur 3 Flags ( gmi) hat.
Morgan Touverey Quilling
4

In Java-basierten regulären Ausdrücken können Sie verwenden [\s\S]

Kamahire
quelle
1
Sollten das nicht Backslashes sein?
Paul Draper
Sie gehen am Ende des regulären Ausdrucks, nicht innerhalb von in. Beispiel: / blah / s
RandomInsano
Ich denke du meinst JavaScript, nicht Java? Da Sie das sFlag einfach in Java zum Muster hinzufügen können und JavaScript das sFlag nicht hat .
3limin4t0r
3

Beachten Sie, dass (.|\n)*dies weniger effizient sein kann als (zum Beispiel) [\s\S]*(wenn die regulären Ausdrücke Ihrer Sprache solche Escapezeichen unterstützen) und als zu finden, wie der Modifikator angegeben wird, der erstellt wird. passen auch zu Zeilenumbrüchen. Oder Sie können mit POSIXy Alternativen wie gehen [[:space:][:^space:]]*.

tye
quelle
3

Verwenden Sie RegexOptions.Singleline, um die Bedeutung von zu ändern. Zeilenumbrüche einschließen

Regex.Replace (content, searchText, replaceText, RegexOptions.Singleline);

shmall
quelle
1

Im Zusammenhang mit der Verwendung in Sprachen wirken reguläre Ausdrücke auf Zeichenfolgen und nicht auf Zeilen. Sie sollten also in der Lage sein, den regulären Ausdruck normal zu verwenden, vorausgesetzt, die Eingabezeichenfolge enthält mehrere Zeilen.

In diesem Fall stimmt der angegebene reguläre Ausdruck mit der gesamten Zeichenfolge überein, da "<FooBar>" vorhanden ist. Abhängig von den Besonderheiten der Regex-Implementierung ist der Wert von $ 1 (erhalten aus "(. *)") Entweder "fghij" oder "abcde \ nfghij". Wie andere bereits gesagt haben, können Sie bei einigen Implementierungen steuern, ob das "." passt zur Newline und gibt Ihnen die Wahl.

Die zeilenbasierte Verwendung regulärer Ausdrücke wird normalerweise für Befehlszeilendinge wie egrep verwendet.

nsayer
quelle
1

Ich hatte das gleiche Problem und löste es wahrscheinlich nicht auf die beste Weise, aber es funktioniert. Ich habe alle Zeilenumbrüche ersetzt, bevor ich mein richtiges Match gemacht habe:

mystring= Regex.Replace(mystring, "\r\n", "")

Ich manipuliere HTML, sodass Zeilenumbrüche in diesem Fall für mich nicht wirklich wichtig sind.

Ich habe alle oben genannten Vorschläge ohne Glück ausprobiert. Ich verwende .Net 3.5 FYI

Slee
quelle
Ich benutze auch .NET und (\s|\S)scheint den Trick für mich zu tun!
Vamshi Krishna
@VamshiKrishna Verwenden Sie in .NET, (?s)um .Zeichen anzupassen . Verwenden Sie (\s|\S)diese Option nicht , um die Leistung zu beeinträchtigen.
Wiktor Stribiżew
1

In Javascript können Sie mit [^] * nach null bis unendlichen Zeichen suchen, einschließlich Zeilenumbrüchen.

$("#find_and_replace").click(function() {
  var text = $("#textarea").val();
  search_term = new RegExp("[^]*<Foobar>", "gi");;
  replace_term = "Replacement term";
  var new_text = text.replace(search_term, replace_term);
  $("#textarea").val(new_text);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="find_and_replace">Find and replace</button>
<br>
<textarea ID="textarea">abcde
fghij&lt;Foobar&gt;</textarea>

Paul Chris Jones
quelle
0

allgemein . stimmt nicht mit Zeilenumbrüchen überein, versuchen Sie es also((.|\n)*)<foobar>

tloach
quelle
3
Nein, tu das nicht. Wenn Sie etwas einschließlich Zeilentrennzeichen finden müssen, verwenden Sie den Modifikator DOTALL (auch bekannt als / s oder SingleLine). Der (. | \ N) -Hack macht den regulären Ausdruck nicht nur weniger effizient, er ist auch nicht korrekt. Zumindest sollte es sowohl mit \ r (Wagenrücklauf) als auch mit \ n (Zeilenvorschub) übereinstimmen. Es gibt auch andere Zeilentrennzeichen, die jedoch nur selten verwendet werden. Wenn Sie jedoch das DOTALL-Flag verwenden, müssen Sie sich keine Sorgen machen.
Alan Moore
1
\ R ist die plattformunabhängige Übereinstimmung für Zeilenumbrüche in Eclipse.
Opyate
@opyate Du solltest dies als Antwort posten, da dieses kleine Juwel unglaublich nützlich ist.
Jeckhart
Sie könnten dies stattdessen versuchen. Es wird nicht mit den inneren Klammern übereinstimmen und auch das optionale berücksichtigen \r.:((?:.|\r?\n)*)<foobar>
ssc-hrep3
0

Ich wollte einen bestimmten if-Block in Java finden

   ...
   ...
   if(isTrue){
       doAction();

   }
...
...
}

Wenn ich die regExp benutze

if \(isTrue(.|\n)*}

Es enthielt die schließende Klammer für den Methodenblock, den ich verwendet habe

if \(!isTrue([^}.]|\n)*}

um die schließende Klammer vom Platzhalter-Match auszuschließen.

Spangen
quelle
0

Oft müssen wir einen Teilstring mit einigen Schlüsselwörtern ändern, die über Zeilen vor dem Teilstring verteilt sind. Betrachten Sie ein XML-Element:

<TASK>
  <UID>21</UID>
  <Name>Architectural design</Name>
  <PercentComplete>81</PercentComplete>
</TASK>

Angenommen, wir möchten die 81 auf einen anderen Wert ändern, z. B. 40. Zuerst identifizieren .UID.21..UID., dann alle Zeichen einschließlich \nbis überspringen .PercentCompleted.. Das Muster für reguläre Ausdrücke und die Ersetzungsspezifikation sind:

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 ("$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>

Die Untergruppe (.|\n)ist wahrscheinlich die fehlende Gruppe $3. Wenn wir es nicht-Capturing, indem (?:.|\n)dann das $3ist (<PercentComplete>). So kann das Muster und replaceSpecauch sein:

pattern = new String("(<UID>21</UID>)((?:.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)");
replaceSpec = new String("$1$2$340$5")

und der Austausch funktioniert korrekt wie zuvor.

user1348737
quelle
0

Wenn Sie in Powershell normalerweise nach drei aufeinander folgenden Zeilen suchen, sieht es folgendermaßen aus:

$file = get-content file.txt -raw

$pattern = 'lineone\r\nlinetwo\r\nlinethree\r\n'     # "windows" text
$pattern = 'lineone\nlinetwo\nlinethree\n'           # "unix" text
$pattern = 'lineone\r?\nlinetwo\r?\nlinethree\r?\n'  # both

$file -match $pattern

# output
True

Seltsamerweise wäre dies Unix-Text an der Eingabeaufforderung, aber Windows-Text in einer Datei:

$pattern = 'lineone
linetwo
linethree
'

So drucken Sie die Zeilenenden aus:

'lineone
linetwo
linethree
' -replace "`r",'\r' -replace "`n",'\n'

# output
lineone\nlinetwo\nlinethree\n
js2010
quelle
-2

Option 1

Eine Möglichkeit wäre, die sFlagge zu verwenden (genau wie die akzeptierte Antwort):

/(.*)<FooBar>/s

Demo 1

Option 2

Eine zweite Möglichkeit wäre die Verwendung des m(mehrzeiligen) Flags und eines der folgenden Muster:

/([\s\S]*)<FooBar>/m

oder

/([\d\D]*)<FooBar>/m

oder

/([\w\W]*)<FooBar>/m

Demo 2

RegEx Circuit

jex.im visualisiert reguläre Ausdrücke:

Geben Sie hier die Bildbeschreibung ein

Emma
quelle