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


129

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

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

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

[sometag] here is more text

it spans more than one line [/sometag]

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

Answers:


239

首先,使用dotall修饰符(?s)使点也与换行符匹配。

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

演示


谢谢!为什么我必须添加那些额外的问号?
莫德基2014年

8
?之后*将进行非贪婪的匹配。考虑[b]foo[/b]foo[b]bar[/b]作为例子。\[b\].*\[\/b\]将匹配从开始b到最后一个结束b的整体。
Avinash Raj 2014年

只是添加和删除玩?这个regex101.com/r/gI0xC3/2
阿维纳什·拉吉

11
(?s)导致点还包含换行符
cmroanirgo

3
星号后的问号很重要,因为它将匹配项定义为非贪婪。
andrej

12

如果由于某些原因不允许修改点的模式,则可以采取以下措施:

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

3
(.|\n)+?如果可以访问DOTALL修饰符,则不要使用。如果无法正常使用(?s),请使用[\s\S]/ [\d\D]/ [\w\W],但不要使用此处建议的替代模式。这种模式效率极低,很容易导致超时问题。
WiktorStribiżew'16

1
@WiktorStribiżew:您能解释一下为什么效率低下吗?我经常使用[\s\S],但乍一看(.|\n)似乎等效?与匹配组有关吗?但是那(?:.|\n)会一样吗?
Cerberus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.