Ich habe sehr ähnliche Beiträge gefunden, aber ich kann meinen regulären Ausdruck hier nicht ganz finden.
Ich versuche, einen regulären Ausdruck zu schreiben, der eine Zeichenfolge zurückgibt, die zwischen zwei anderen Zeichenfolgen liegt. Zum Beispiel: Ich möchte die Zeichenfolge erhalten, die sich zwischen den Zeichenfolgen "Kuh" und "Milch" befindet.
Meine Kuh gibt immer Milch
würden zurückkehren
"gibt immer"
Hier ist der Ausdruck, den ich bisher zusammengesetzt habe:
(?=cow).*(?=milk)
Dies gibt jedoch die Zeichenfolge "Kuh gibt immer" zurück.
javascript
regex
string
phil
quelle
quelle
Antworten:
Ein Lookahead (dieser
(?=
Teil) verbraucht keine Eingabe. Es handelt sich um eine Behauptung mit einer Breite von Null (ebenso wie Grenzprüfungen und Lookbehinds).Sie möchten hier ein reguläres Match, um die
cow
Portion zu verbrauchen . Um den Teil dazwischen zu erfassen, verwenden Sie eine Erfassungsgruppe (setzen Sie einfach den Teil des Musters, den Sie erfassen möchten, in Klammern):Es werden überhaupt keine Lookaheads benötigt.
quelle
matched[1]
, nicht den gesamten übereinstimmenden Text mitmatched[0]
.([\s\S]*?)
eher als verwenden(.*?)
.Die vollständigste Lösung, die in den allermeisten Fällen funktioniert, ist die Verwendung einer Erfassungsgruppe mit einem Lazy Dot Matching-Muster . Ein Punkt
.
in JavaScript-Regex stimmt jedoch nicht mit Zeilenumbruchzeichen überein. In 100% der Fälle funktioniert also ein[^]
oder[\s\S]
/[\d\D]
/[\w\W]
Konstrukt.ECMAScript 2018 und neuere kompatible Lösung
In JavaScript-Umgebungen, die ECMAScript 2018 unterstützen , können mit dem
s
Modifikator.
alle Zeichen einschließlich Zeilenumbruchzeichen abgeglichen werden, und die Regex-Engine unterstützt Lookbehinds mit variabler Länge. Sie können also einen regulären Ausdruck wie verwendenIn beiden Fällen wird die aktuelle Position
cow
mit 1/0 oder mehr Leerzeichen danach überprüftcow
, dann werden alle 0+ Zeichen so wenig wie möglich abgeglichen und verbraucht (= zum Übereinstimmungswert hinzugefügt) und dannmilk
überprüft (mit einem beliebigen) 1/0 oder mehr Leerzeichen vor diesem Teilstring).Szenario 1: Einzeilige Eingabe
Dieses und alle anderen unten aufgeführten Szenarien werden von allen JavaScript-Umgebungen unterstützt. Siehe Verwendungsbeispiele am Ende der Antwort.
cow
zuerst, dann ein Leerzeichen, dann alle 0+ Zeichen außer Zeilenumbruch Zeichen, so wenig wie möglich zu finden ist wie*?
ein fauler quantifier ist, werden in Gruppe 1 erfasst und dann ein Raum mitmilk
folgen müssen (und die aufeinander abgestimmt sind und verbraucht auch ).Szenario 2: Mehrzeilige Eingabe
Hier wird zuerst
cow
ein Leerzeichen abgeglichen, dann werden möglichst wenige 0+ Zeichen abgeglichen und in Gruppe 1 erfasst, und dann wird ein Leerzeichen mitmilk
abgeglichen.Szenario 3: Überlappende Übereinstimmungen
Wenn Sie eine Zeichenfolge wie
>>>15 text>>>67 text2>>>
und Sie müssen zwei Spiele bekommen in-zwischen>>>
+number
+whitespace
und>>>
können Sie nicht verwenden ,/>>>\d+\s(.*?)>>>/g
da dies nur ein Spiel aufgrund der Tatsache , finden die>>>
zuvor67
bereits verbraucht bei der Suche nach der ersten Partie. Sie können einen positiven Lookahead verwenden , um die Textpräsenz zu überprüfen, ohne sie tatsächlich zu "verschlingen" (dh an das Spiel anzuhängen):Siehe die Online-Regex-Demo mit
text1
undtext2
als Gruppe 1 Inhalte.Siehe auch So erhalten Sie alle möglichen überlappenden Übereinstimmungen für eine Zeichenfolge .
Leistungsüberlegungen
Lazy Dot Matching Pattern (
.*?
) in Regex-Mustern kann die Skriptausführung verlangsamen, wenn sehr lange Eingaben gemacht werden. In vielen Fällen hilft die Unroll-the-Loop-Technik in größerem Maße. Beim Versuch, alle zwischencow
undmilk
von zu erfassen"Their\ncow\ngives\nmore\nmilk"
, sehen wir, dass wir nur alle Zeilen abgleichen müssen, die nicht mit beginnen. Daher können wirmilk
stattdessencow\n([\s\S]*?)\nmilk
Folgendes verwenden:Siehe die Regex-Demo (falls vorhanden
\r\n
, verwenden/cow\r?\n(.*(?:\r?\n(?!milk$).*)*)\r?\nmilk/gm
). Mit dieser kleinen Testzeichenfolge ist der Leistungsgewinn vernachlässigbar, aber bei sehr großem Text werden Sie den Unterschied spüren (insbesondere wenn die Zeilen lang und die Zeilenumbrüche nicht sehr zahlreich sind).quelle
Hier ist eine Regex, die erfasst, was zwischen Kuh und Milch liegt (ohne führenden / nachfolgenden Leerzeichen):
Ein Beispiel: http://jsfiddle.net/entropo/tkP74/
quelle
.*
.*
Nongreedy machenDer Lookahead ist wirklich nicht nötig.
quelle
Die gewählte Antwort hat bei mir nicht funktioniert ... hmm ...
Fügen Sie einfach Platz nach der Kuh und / oder vor der Milch hinzu, um Leerzeichen von "immer gibt" zu entfernen.
quelle
?<=
wird in Javascript nicht unterstützt.Mit der folgenden Lösung von Martinho Fernandes konnte ich das bekommen, was ich brauchte. Der Code lautet:
Sie werden feststellen, dass ich die Variable testRE als Array alarmiere. Dies liegt daran, dass testRE aus irgendeinem Grund als Array zurückgegeben wird. Die Ausgabe von:
Änderungen in:
quelle
Verwenden Sie einfach den folgenden regulären Ausdruck:
quelle
?<=
wird in Javascript nicht unterstützt. Wäre aber der Weg, es zu tun.Ich finde Regex angesichts der Syntax mühsam und zeitaufwändig. Da Sie bereits Javascript verwenden, ist es einfacher, Folgendes ohne Regex zu tun:
quelle
Wenn sich die Daten in mehreren Zeilen befinden, müssen Sie möglicherweise Folgendes verwenden:
Regex 101 Beispiel
quelle
Die Methode match () durchsucht eine Zeichenfolge nach einer Übereinstimmung und gibt ein Array-Objekt zurück.
quelle
Aufgabe
Teilzeichenfolge zwischen zwei Zeichenfolgen extrahieren (ohne diese beiden Zeichenfolgen)
Lösung
quelle