Frage

Zum Beispiel, diese regex

(.*)<FooBar>

passen:

abcde<FooBar>

Aber wie bekomme ich es übereinstimmen über mehrere Zeilen?

abcde
fghij<FooBar>
War es hilfreich?

Lösung

Es hängt von der Sprache, aber es sollte ein Modifikator sein, die Sie den RegexMuster hinzufügen können. In PHP ist es:

/(.*)<FooBar>/s

Die s am Ende der Punkt führt zu entsprechen alle Zeichen einschließlich Zeilenumbrüchen.

Andere Tipps

Versuchen Sie folgendes:

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

Es sagt im Grunde „ein beliebiges Zeichen oder ein Zeilenumbruch“, wiederholte null oder mehrere Male.

Wenn Sie mit Eclipse suchen, können Sie die „DOTALL“ Option aktivieren zu machen ‚‘ passen alle Zeichen einschließlich Zeilentrennzeichen: fügen Sie einfach „(? s)“ am Anfang Ihrer Suchzeichenfolge. Beispiel:

(?s).*<FooBar>

Die Frage ist, können . pattern match alle Charakter?Die Antwort variiert von Motor zu Motor.Der Haupt-Unterschied ist, ob das Muster wird von einer POSIX-oder nicht-POSIX-regex-Bibliothek.

Besonderer Hinweis über :Sie sind nicht als reguläre Ausdrücke, aber . entspricht einem beliebigen char es, gleiche wie POSIX-basierten Motoren.

Ein weiterer Hinweis auf und :die . entspricht einem beliebigen char standardmäßig (demo): str = "abcde\n fghij<Foobar>"; expression = '(.*)<Foobar>*'; [tokens,matches] = regexp(str,expression,'tokens','match'); (tokens enthalten abcde\n fghij Element).

Auch in allen 's regex Grammatiken der Punkt entspricht Zeilenumbrüche durch Standard.Erhöhung der ECMAScript-Grammatik ermöglicht Sie, diese zu deaktivieren mit regex_constants::no_mod_m (Quelle).

Für (es ist POSIX-basiert) verwenden n option (demo): select regexp_substr('abcde' || chr(10) ||' fghij<Foobar>', '(.*)<Foobar>', 1, 1, 'n', 1) as results from dual

POSIX-basierte Motoren:

Eine bloße . bereits entspricht, Zeilenumbrüche, keine Notwendigkeit, irgendwelche Modifikatoren finden Sie unter (demo).

Die (demo), (demo), (TRE, base R Standard engine mit keinem perl=TRUE, für sockel R mit perl=TRUE oder für stringr/stringi Muster, die Verwendung der (?s) inline-Modifikator) (demo) behandeln . auf die gleiche Weise.

Jedoch, die meisten POSIX-basierte Werkzeuge, Prozess-input line by line.Daher . nicht mit der Zeile bricht, nur weil Sie nicht in den Anwendungsbereich.Hier sind einige Beispiele, wie dies außer Kraft setzen:

  • - Es gibt mehrere Problemumgehungen, die präzise, aber nicht sehr sicher ist sed 'H;1h;$!d;x; s/\(.*\)><Foobar>/\1/' (H;1h;$!d;x; schlürft die Datei in den Arbeitsspeicher).Wenn ganze Zeilen müssen enthalten sein sed '/start_pattern/,/end_pattern/d' file (die Entfernung vom start-Ende wird abgestimmt Linien im Lieferumfang enthalten) oder sed '/start_pattern/,/end_pattern/{{//!d;};}' file (mit den passenden Linien ausgeschlossen) betrachtet werden kann.
  • - perl -0pe 's/(.*)<FooBar>/$1/gs' <<< "$str" (-0 schlürft die gesamte Datei in den Speicher, -p druckt die Datei nach der Anwendung des Skripts gegeben durch -e).Bitte beachten Sie, dass -000pe wird schlürfen Sie die Datei und aktivieren Sie die 'Absatz-Modus', wo Perl verwendet aufeinanderfolgende Zeilenumbrüche (\n\n) als record-separator.
  • - grep -Poz '(?si)abc\K.*?(?=<Foobar>)' file.Hier, z ermöglicht die Datei schlürfen, (?s) ermöglicht die DOTALL-Modus für die . Muster, (?i) ermöglicht der groß-und Kleinschreibung-Modus, \K unterlässt der text aufeinander abgestimmt, so weit, *? ist eine faule Quantifizierer, (?=<Foobar>) entspricht die Lage vor <Foobar>.
  • - pcregrep -Mi "(?si)abc\K.*?(?=<Foobar>)" file (M ermöglicht die Datei schlürfen hier).Hinweis pcregrep ist eine gute Lösung für Mac OS grep Benutzer.

Siehe demos.

Nicht-POSIX-basierte Motoren:

  • - Verwendung s modifier PCRE_DOTALL modifier: preg_match('~(.*)<Foobar>~s', $s, $m) (demo)
  • - Verwendung RegexOptions.Singleline flag (demo):
    - var result = Regex.Match(s, @"(.*)<Foobar>", RegexOptions.Singleline).Groups[1].Value;
    - var result = Regex.Match(s, @"(?s)(.*)<Foobar>").Groups[1].Value;
  • - Verwendung (?s) inline-option: $s = "abcde`nfghij<FooBar>"; $s -match "(?s)(.*)<Foobar>"; $matches[1]
  • - Verwendung s modifier (oder (?s) inline-version am start) (demo): /(.*)<FooBar>/s
  • - Verwendung 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)))
  • - Verwendung Pattern.DOTALL modifier (oder inline - (?s) flag) (demo): Pattern.compile("(.*)<FooBar>", Pattern.DOTALL)
  • - Verwendung (?s) in-pattern-modifier (demo): regex = /(?s)(.*)<FooBar>/
  • - Verwendung (?s) modifier (demo): "(?s)(.*)<Foobar>".r.findAllIn("abcde\n fghij<Foobar>").matchData foreach { m => println(m.group(1)) }
  • - Verwendung [^] oder Problemumgehungen [\d\D] / [\w\W] / [\s\S] (demo): s.match(/([\s\S]*)<FooBar>/)[1]
  • (std::regex) Verwenden [\s\S] oder die JS workarounds (demo): regex rex(R"(([\s\S]*)<FooBar>)");
  • - Verwenden Sie den gleichen Ansatz wie in JavaScript, ([\s\S]*)<Foobar>.
  • - Verwendung /m MULTILINE modifier (demo): s[/(.*)<Foobar>/m, 1]
  • - Verwenden Sie die inline-Modifikator (?s) am start (demo): re: = regexp.MustCompile(`(?s)(.*)<FooBar>`)
  • - Verwendung dotMatchesLineSeparators oder (einfacher) pass, der (?s) inline-Modifikator, um das Muster: let rx = "(?s)(.*)<Foobar>"
  • - Das gleiche wie Swift, (?s) funktioniert die einfachste, aber hier ist, wie die option kann verwendet werden,: NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionDotMatchesLineSeparators error:&regexError];
  • , - Verwendung (?s) modifier (demo): "(?s)(.*)<Foobar>" (in Google-Tabellen, =REGEXEXTRACT(A2,"(?s)(.*)<Foobar>"))

HINWEISE AUF (?s):

In den meisten nicht-POSIX-Motoren, (?s) inline-Modifikator (oder embedded-flag-option) kann verwendet werden, um durchzusetzen . passend Zeilenumbrüche.

Wenn Sie am Beginn des Musters, (?s) änderungen der bahavior aller . in die Muster.Wenn die (?s) ist irgendwo gelegt, nachdem der Anfang, nur die . betroffen, die sich auf der rechten Seite es sei denn, dies ist ein Muster übergeben Python re.In Python re, unabhängig von der (?s) Lage, das ganze Muster . betroffen sind.Die (?s) Wirkung ist gestoppt mit (?-s).Eine modifizierte Gruppe kann genutzt werden, um nur auf einen bestimmten Bereich des ein regex-Muster (z.B. Delim1(?s:.*?)\nDelim2.* wird die erste .*? Spiel über Zeilenumbrüche und die zweite .* nur mit dem rest der Linie).

POSIX-Hinweis:

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

In POSIX, [\s\S] nicht passend zu jedem char (wie in JavaScript oder einem nicht-POSIX-Motor), da die regex-escape-Sequenzen werden nicht unterstützt innere Klammer-Ausdrücken. [\s\S] analysiert wird, wie die Klammer-Ausdrücke, die mit einem einzelnen char, \ oder s oder S.

In JavaScript verwendet /[\S\s]*<Foobar>/. Quelle

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

Der Punkt passt alle außer Zeilenumbrüche (\ r \ n). So verwenden \ s \ S, die alle Zeichen übereinstimmen.

In Rubin die 'm' Option verwenden kann (mehrzeilige):

/YOUR_REGEXP/m

Siehe der Regexp Dokumentation auf ruby-doc. org für weitere Informationen.

können wir auch verwenden

(.*?\n)*?

alles, einschließlich Newline ohne gierig entsprechen

Damit wird die neue Linie optional

machen
(.*?|\n)*?

"." normalerweise nicht Zeilenumbrüche übereinstimmen. Die meisten regex Motoren können Sie die S-Flag (auch DOTALL und SINGLELINE genannt) hinzuzufügen, auch zu machen "." newlines entsprechen. Wenn das fehlschlägt, könnte man so etwas wie [\S\s] tun.

für Eclipse gearbeitet folgenden Ausdruck:

  

Foo

     

jadajada Bar "

Regular-Expression:

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

die s verursacht Punkt (.) Zeilenumbrüche übereinstimmen

In Java-basierte regulären Ausdruck können Sie [\s\S] verwenden

, dass (.|\n)* Hinweis sein kann weniger effizient als (zum Beispiel) [\s\S]* (wenn Sie die Sprache des Regexes solcher Fluchten unterstützt) und als zu finden, wie man den Modifikator angeben, die machen. auch neue Zeilen entsprechen. Oder Sie können mit POSIXy Alternativen wie [[:space:][:^space:]]* gehen.

Mit RegexOptions.Singleline, es ändert sich die Bedeutung. umfassen newlines

Regex.Replace (Inhalt, search, replaceText, RegexOptions.Singleline);

Lösung:

Verwenden Muster Modifikator sU die gewünschte Anpassung in PHP bekommen.

Beispiel:

preg_match('/(.*)/sU',$content,$match);

Quelle:

http://dreamluverz.com/developers-tools/ Regex-match-all-inklusive-new-line http://php.net/manual/en/reference.pcre.pattern .modifiers.php

Im Rahmen der Verwendung in Sprachen, handeln reguläre Ausdrücke bei Strings, nicht Linien. So sollten Sie in der Lage sein, die Regex zu verwenden, die normalerweise unter der Annahme, dass die Eingabezeichenfolge mehr Zeilen hat.

In diesem Fall wird die angegebene Regex die gesamte Zeichenfolge übereinstimmen, da „“ vorhanden ist. In Abhängigkeit von den Besonderheiten der regex Implementierung, der $ 1-Wert (erhalten aus dem „(. *)“) Wird entweder „fghij“ oder „ABCDE \ nfghij“. Wie andere gesagt haben, erlauben einige Implementierungen, ob das zu kontrollieren „“ das Newline, Ihnen die Wahl zu geben.

Line-basierte regulärer Ausdruck ist in der Regel für die Kommandozeilen Dinge wie egrep.

Ich hatte das gleiche Problem und löste es in wahrscheinlich nicht den besten Weg, aber es funktioniert. Ich ersetzen alle Zeilenumbrüche, bevor ich mein wirkliches Spiel tat:

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

Ich bin zu manipulieren HTML so Zeilenumbrüche mir nicht wirklich in diesem Fall egal.

Ich habe versucht, alle Vorschläge oben ohne Glück, ich bin mit .Net 3.5 FYI

In Javascript können Sie mit [^] * für null bis unendlich Zeichen suchen, einschließlich Zeilenumbrüche.

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

im Allgemeinen. nicht Zeilenumbrüche übereinstimmen, so versucht ((.|\n)*)<foobar>

Ich wollte, wenn Block in Java einen bestimmten passen

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

   }
...
...
}

Wenn ich die regExp

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

es enthielt die schließende Klammer für das Verfahren Block so verwendet I

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

die schließende Klammer aus dem Wildcard-Spiel auszuschließen.

Oft müssen wir die sich auf Linien einen Teil mit einem paar Stichworten ändern den Teil vorhergehenden. Betrachten wir ein XML-Element:

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

Angenommen, wir wollen die 81, auf einen anderen Wert ändern, sagen 40. Zunächst .UID.21..UID. identifizieren, überspringen dann alle Zeichen einschließlich \n bis .PercentCompleted.. Das Muster für reguläre Ausdrücke und die ersetzen Spezifikation 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 von (?:.|\n) machen, dann ist das $3 (<PercentComplete>). Also das Muster und replaceSpec kann auch sein:

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

und der Austausch korrekt funktioniert wie zuvor.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top