ChatGPT解决这个技术问题 Extra ChatGPT

Sublime Text 正则表达式未检测到多行标签

我这里有这个正则表达式;

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

它应该捕获由 [sometag] 标记包围的文本。它适用于这些标签中包含的单行信息,例如字符串 [sometag]this is a bit of text[/sometag]。但它不适用于像这样跨越多行的文本;

[sometag] here is more text

it spans more than one line [/sometag]

由于某种原因,Sublime text 的正则表达式查找器无法识别多行的标签。我想知道这是否是 Sublime Text 的问题,一个可切换的选项,或者只是我个人对正则表达式的无能。


A
Avinash Raj

在开始时,使用 dotall 修饰符 (?s) 使 dot 也匹配换行符。

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

DEMO


谢谢!为什么我必须包括那些额外的问号?
* 之后的 ? 将进行非贪婪匹配。以 [b]foo[/b]foo[b]bar[/b] 为例。 \[b\].*\[\/b\] 将匹配从开始 b 到最后结束 b 的整体。
只需在此 regex101.com/r/gI0xC3/2 中添加和删除 ?
(?s) 导致点也包括换行符
S
SynCap

如果由于某些原因不允许修改 dot 的模式,您可能会认为:

[sometag](.|\n)+?[/sometag]

如果您有权访问 DOTALL 修饰符,切勿使用 (.|\n)+?。如果您不能以某种方式使用 (?s),请使用 [\s\S]/[\d\D]/[\w\W],但不要使用此处建议的交替模式。这种模式效率很低,很容易导致超时问题。
@WiktorStribiżew:你能解释一下为什么它效率低吗?我总是使用 [\s\S],但乍一看 (.|\n) 似乎等效?是否与匹配组有关?但是 (?:.|\n) 会是一样的吗?