Sublime Text-Regex erkennt keine mehrzeiligen Tags

129

Ich habe diesen regulären Ausdruck hier;

\[sometag\](.*)\[/sometag\]

Welches soll Text fangen, der von dem [sometag]Tag umgeben ist. Es funktioniert für einzeilige Informationen, die in diesen Tags enthalten sind, wie in der Zeichenfolge [sometag]this is a bit of text[/sometag]. Bei Text, der mehrere Zeilen umfasst, funktioniert dies jedoch nicht.

[sometag] here is more text

it spans more than one line [/sometag]

Aus irgendeinem Grund erkennt der Regex-Finder von Sublime Text die Tags nicht über mehrere Zeilen hinweg. Ich möchte wissen, ob dies ein Problem mit Sublime Text, eine umschaltbare Option oder nur meine persönliche Inkompetenz mit regulären Ausdrücken ist.

Maurdekye
quelle

Antworten:

239

Verwenden Sie (?s)zu Beginn einen Dotall-Modifikator , um den Punkt so zu gestalten, dass er auch mit Zeilenumbruchzeichen übereinstimmt.

(?s)\[sometag\](.*?)\[\/sometag\]

DEMO

Avinash Raj
quelle
Vielen Dank! Warum muss ich diese zusätzlichen Fragezeichen einfügen?
Maurdekye
8
?danach *wird ein nicht gieriges Match machen. Betrachten Sie [b]foo[/b]foo[b]bar[/b]als Beispiel. \[b\].*\[\/b\]würde das Ganze vom Start b bis zum letzten Abschluss b zusammenbringen.
Avinash Raj
Spielen Sie einfach mit dem Hinzufügen und Entfernen der ?in diesem regex101.com/r/gI0xC3/2
Avinash Raj
11
(? s) bewirkt, dass der Punkt auch Zeilenumbrüche enthält
cmroanirgo
3
Das Fragezeichen nach dem Sternchen ist wichtig, da es die Übereinstimmung als nicht gierig definiert.
Andrej
12

Wenn das Ändern des Punktmodus aus bestimmten Gründen unzulässig ist, können Sie Folgendes annehmen:

[sometag](.|\n)+?[/sometag]
SynCap
quelle
3
Verwenden (.|\n)+?Sie diese Option niemals, wenn Sie Zugriff auf den Modifikator DOTALL haben. Wenn Sie (?s)in einem Falvor nicht verwenden können, verwenden Sie [\s\S]/ [\d\D]/ [\w\W], aber nicht das hier vorgeschlagene Wechselmuster. Dieses Muster ist sehr ineffizient und kann leicht zu einem Timeout-Problem führen.
Wiktor Stribiżew
1
@ WiktorStribiżew: Kannst du erklären, warum es ineffizient ist? Ich benutze immer [\s\S], aber auf den ersten Blick (.|\n)scheint gleichwertig? Hat es mit passenden Gruppen zu tun? Aber (?:.|\n)wäre dann das gleiche?
Cerberus