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.

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


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]

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.