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

Mau*_*kye 112 regex tags sublimetext

我有这个正则表达式;

\[sometag\](.*)\[/sometag\]
Run Code Online (Sandbox Code Playgroud)

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

[sometag] here is more text

it spans more than one line [/sometag]
Run Code Online (Sandbox Code Playgroud)

出于某种原因,Sublime文本的正则表达式查找程序将无法识别多行中的标记.我想知道这是Sublime Text的一个问题,一个可以切换的选项,还是我的个人无法使用正则表达式.

Avi*_*Raj 217

在开始时,使用dotall修饰符(?s)使点与新行字符匹配.

(?s)\[sometag\](.*?)\[\/sometag\]
Run Code Online (Sandbox Code Playgroud)

DEMO

  • (?s)使点也包括换行符 (11认同)
  • 在`*`之后```会做一个非贪婪的比赛.考虑`[b] foo [/ b] foo [b] bar [/ b]`作为例子.`\ [b \].*\[\/b \]`将匹配从起始b到最后一个结束b的整体. (7认同)
  • 星号后的问号非常重要,因为它将匹配定义为非贪婪. (2认同)

Syn*_*Cap 9

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

[sometag](.|\n)+?[/sometag]
Run Code Online (Sandbox Code Playgroud)

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