Sublime Text regex nie wykrywa znaczników wielowierszowych

129

Mam tutaj to wyrażenie regularne;

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

Który ma przechwytywać tekst otoczony [sometag]tagiem. Działa dla informacji jednowierszowych zawartych w tych tagach, takich jak w ciągu [sometag]this is a bit of text[/sometag]. Ale to nie działa na tekście, który obejmuje wiele linii, w ten sposób;

[sometag] here is more text

it spans more than one line [/sometag]

Z jakiegoś powodu wyszukiwarka wyrażeń regularnych Sublime text nie rozpoznaje tagów w wielu wierszach. Chcę wiedzieć, czy jest to problem z Sublime Text, opcją przełączaną, czy po prostu moją osobistą niekompetencją z wyrażeniami regularnymi.

Maurdekye
źródło

Odpowiedzi:

239

Na początku użyj modyfikatora dotall, (?s)aby kropka pasowała również do znaków nowej linii.

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

PRÓBNY

Avinash Raj
źródło
Dzięki! Dlaczego jednak muszę uwzględniać te dodatkowe znaki zapytania?
Maurdekye
8
?potem *zrobi niechciany mecz. Rozważ [b]foo[/b]foo[b]bar[/b]jako przykład. \[b\].*\[\/b\]dopasuje całość od początku b do ostatniego zamknięcia b.
Avinash Raj
po prostu baw się dodawaniem i usuwaniem ?w tym regex101.com/r/gI0xC3/2
Avinash Raj
11
(? s) powoduje, że kropka zawiera również
znaki
3
znak zapytania po gwiazdce jest ważny, ponieważ określa dopasowanie jako niechciwe.
andrej
12

Jeśli modyfikacja trybu kropki jest z jakichś powodów niedopuszczalna, możesz przyjąć, że:

[sometag](.|\n)+?[/sometag]
SynCap
źródło
3
Nigdy nie używaj, (.|\n)+?jeśli masz dostęp do modyfikatora DOTALL. Jeśli nie możesz użyć (?s)jakiegoś falvor, użyj [\s\S]/ [\d\D]/ [\w\W], ale nie sugerowanego tutaj wzoru naprzemiennego. Ten wzorzec jest wysoce nieefektywny i może łatwo doprowadzić do problemu z przekroczeniem limitu czasu.
Wiktor Stribiżew
1
@ WiktorStribiżew: Czy możesz wyjaśnić, dlaczego jest to nieefektywne? Zawsze używam [\s\S], ale na pierwszy rzut oka (.|\n)wydaje się to równoważne? Czy ma to związek z dopasowanymi grupami? Ale (?:.|\n)czy byłoby to samo?
Cerberus