Dies ist ein Beispiel für eine Zeichenfolge.
<div>other text</div> some text abc , <div>need_match_this</div> bbbb <p>hsa</p> aa <span>hello</span>
Ich kenne nur das Ende der Saite "<span>hello</span>"
und ich muss Text in der nächsten "über" div übereinstimmen.
Ich habe diesen Regex verwendet:
<div>(.*?)</div>.*?<span>hello</span>
Aber das funktioniert nicht für mich, weil ich nur den Text des nächsten Divs zurückgeben muss, nicht das erste Div in der Zeichenfolge.
Gibt es eine Regex-Lösung, um das Problem zu lösen?
Bitte helfen Sie.
Vielen Dank
Antworten:
5 für die Antwort № 1Sie müssen eine negative Lookahead-basierte Regex anstelle von Dazwischen verwenden .*?
, schon seit .*?
würde auch zum Öffnen oder Schließen passen div
Stichworte.
<div>((?:(?!</?div>).)*?)</div>(?:(?!</?div>).)*?<span>hello</span>
(?:(?!</?div>).)*?
Erzwingt, dass die Regex-Engine mit einem beliebigen Zeichen übereinstimmt, jedoch nicht mit <div>
oder </div>
. Das heißt, vor dem Zuordnen jedes Zeichens würde diese Regex prüfen, ob dieses bestimmte Zeichen nicht das Anfangszeichen ist <div>
oder </div>
. Wenn ja, würde es diesem bestimmten Charakter entsprechen. Wenn nein, wird die Übereinstimmung abrupt abgebrochen und der folgende Charakter wird nicht gefunden.
Beispiel:
Schnur - <div></div>
Regex - <div>((?:(?!</?div>).)*?)</div>
Für diese Eingabe würde die oben erwähnte Regex die Leerzeichenkette zwischenDh die leere Zeichenfolge existiert zwischen dem Öffnen und Schließen div
Stichworte). (?!</?div>).
im obigen würde nach dem folgenden Zeichen suchen, das nicht ein beginnendes Zeichen in sein sollte <div>
oder </div>
aber das scheitert seit dem folgenden char <
Das ist ein Star-Char </div>
. Weil wir diesen bestimmten Regex so definiert haben, dass er null oder mehrmals wiederholt, (?:(?!</?div>).)*?
, erfasst es die dazwischenliegende leere Zeichenfolge.