3

我正在尝试为 Sublime Text 创建一个新的语法定义。我已经制定了正则表达式来突出显示每一行中的匹配项,但我希望匹配项包括新行以及任何字符。这是 tmLanguage 文件中的正则表达式,它在一行中工作:

<key>match</key>
<string>\{\+\+(.*?)\+\+[ \t]*(\[(.*?)\])?[ \t]*\}</string>

我试图修改点 (.) 匹配以跨越多行,但它实际上似乎并没有捕获整个块。我的理解是修饰符 ?m: 应该可以工作,但不能。

<key>match</key>
<string>(?m:(\{\+\+(.*?)\+\+[ \t]*(\[(.*?)\])?[ \t]*\}))</string>

有没有办法声明将跨多行匹配的语言定义正则表达式?

4

1 回答 1

4

改用单行修饰符:

<key>match</key>
<string>(?s:(\{\+\+(.*?)\+\+[ \t]*(\[(.*?)\])?[ \t]*\}))</string>

你误解了(?m)修饰符。 您的正则表达式始终应用于单行。

  • 使用多行修饰符意味着您的正则表达式会将您的文本视为多行(这是默认行为),然后它会^(...)$在每一行周围添加。
  • 使用单行修饰符,^(...)$不会添加,然后.会匹配\r\n
于 2013-05-03T12:32:49.783 回答