Ich habe einen regulären Ausdruck geschrieben, um Zeichenfolgen aus HTML abzurufen, aber es scheint, dass das mehrzeilige Flag nicht funktioniert.
Dies ist mein Muster und ich möchte den Text in h1
Tag bekommen.
var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];
Ich habe einen String erstellt, um ihn zu testen. Wenn die Zeichenfolge "\ n" enthält, ist das Ergebnis immer null. Wenn ich alle "\ n" entfernt habe, habe ich das richtige Ergebnis erzielt, egal mit oder ohne /m
Flagge.
Was ist los mit meiner Regex?
javascript
regex
Peter Mortensen
quelle
quelle
dotAll
Modifikator haben wird, damit Sie dies tun können,/.../s
und Ihre Punkte auch mit neuen Zeilen übereinstimmen. Ab Juli 2017 steht es hinter einer Flagge in Chrome.Antworten:
Sie suchen nach dem
/.../s
Modifikator, der auch als Dotall- Modifikator bezeichnet wird. Es erzwingt, dass der Punkt.
auch mit Zeilenumbrüchen übereinstimmt, was standardmäßig nicht der Fall ist .Die schlechte Nachricht ist, dass es
in JavaScript nicht vorhanden ist(ab ES2018, siehe unten) . Die gute Nachricht ist, dass Sie es umgehen können, indem Sie eine Zeichenklasse (z. B.\s
) und ihre Negation (\S
) zusammen verwenden, wie folgt :In Ihrem Fall würde der reguläre Ausdruck also werden:
Ab ES2018 unterstützt JavaScript das
s
Flag (dotAll). In einer modernen Umgebung kann Ihr regulärer Ausdruck also so sein, wie Sie ihn geschrieben haben, jedoch mit einems
Flag am Ende (anstattm
;m
ändert, wie^
und$
funktioniert, nicht.
):quelle
.
, aber ein übereinstimmendes Leerzeichen (\s
) bedeutet, dass es übereinstimmt\n
(was.
in JavaScript nicht funktioniert oder mit dems
Flag zu tun hat ).[^]
auch für alle Zeichen, einschließlich Zeilenumbrüche, in JavaScript. Siehe developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…*?
Quantifizierer anstelle zu*
verwenden, um Gier zu vermeiden. Auf diese Weise wird vermieden, dass das letzte <h1> des Dokuments abgefangen wird: Dies ist wahrscheinlich nicht das, was Sie möchten, und dies ist nicht effizient, da der reguläre Ausdruck bis zum Ende der Zeichenfolge weiterhin nach <h1> sucht, selbst wenn er es bereits zuvor gefunden hat.Sie möchten den
s
Modifikator (dotall), der in Javascript anscheinend nicht vorhanden ist - Sie können ihn durch.
[\ s \ S] ersetzen, wie von @molf vorgeschlagen. Mit demm
Modifikator (mehrzeilig) werden die Zeilen ^ und $ und nicht die gesamte Zeichenfolge abgeglichen.quelle
s
Flagge (ES2018). :-)[\s\S]
hat bei mir in nodejs 6.11.3 nicht funktioniert. Basierend auf der RegExp-Dokumentation heißt es zu verwenden,[^]
was für mich funktioniert.Beispielsweise:
/This is on line 1[^]*?This is on line 3/m
bei dem die *? ist das nicht gierige Ergreifen von 0 oder mehr Vorkommen von [^].
quelle
[^]
bedeutet: Es ist wie eine doppelte Negation: "Entspricht einem beliebigen Zeichen, das nicht in dieser leeren Liste enthalten ist", und es kommt darauf an, "Entspricht einem beliebigen Zeichen" zu sagen .Der Dotall-Modifikator hat es im Juni 2018 tatsächlich in JavaScript geschafft, dh in ECMAScript 2018.
https://github.com/tc39/proposal-regexp-dotall-flag
quelle
Mein Vorschlag ist, dass es besser ist, die mehrzeilige Zeichenfolge mit "\ n" zu teilen und die Teilungen der ursprünglichen Zeichenfolge zu verketten, um eine einzelne Zeile zu erhalten und einfach zu bearbeiten.
quelle