Rob*_*man 5 regex sublimetext2
我正在尝试创建一个自定义语法语言文件来突出显示并帮助在 Sublime Text 2 中创建新文档。我已经取得了很大的进展,但我遇到了有关 tmLanguage 文件中正则表达式搜索的特定问题。我只是希望能够在 YAML 文档中的多行上匹配正则表达式,然后将其转换为 PList 以在 Sublime Text 中作为包使用。这是行不通的。
这是我的正则表达式:
/(foo[^.#]*bar)/
Run Code Online (Sandbox Code Playgroud)
这就是 tmLanguage YAML 文档内部的样子:
patterns:
- include: '#test'
repository:
test:
comment: Tester pattern
name: constant.numeric.xdoc
match: (foo[^.#]*bar)
Run Code Online (Sandbox Code Playgroud)
如果我将此 YAML 构建为 tmLanguage 文件并将其用作 Sublime Text 中的包,我将创建一个使用此自定义语法的文档,尝试一下,会发生以下情况:
这将匹配:
foo 12345 bar
Run Code Online (Sandbox Code Playgroud)
这不会匹配:
foo
12345
bar
Run Code Online (Sandbox Code Playgroud)
在正则表达式测试器中,它们应该并且将会匹配,但在我的 tmLanguage 文件中它不起作用。
我还尝试在 tmLanguage 文件中向我的正则表达式添加修饰符,但以下操作要么不起作用,要么完全破坏文档:
match: (/foo[^.#]*bar/gm)
match: /(/foo[^.#]*bar/)/gm
match: /foo[^.#]*bar/gm
match: foo[^.#]*bar
Run Code Online (Sandbox Code Playgroud)
注意:我的正则表达式规则在测试器中有效,此问题仅出现在 Sublime Text 2 中的 tmLanguage 文件中。
任何帮助是极大的赞赏。
编辑:我使用匹配而不是开始/结束子句的原因是因为我想使用捕获组给它们不同的名称。如果有人有一个带有 begin 和 end 子句的解决方案,您仍然可以以不同的方式命名“foo”、“12345”和“bar”,那对我来说也很好。
我发现这是不可能做到的。这直接来自TextMate 手册,它是 Sublime Text 所基于的文本编辑器。
12.2 语言规则
<...>
请注意,正则表达式一次仅与文档的一行进行匹配。这意味着不可能使用匹配多行的模式。这样做的原因是技术性的:能够在任意行重新启动解析器,并且只需重新解析受编辑影响的最少行数。在大多数情况下,可以使用开始/结束模型来克服此限制。
我的情况是开始/结束模型无法克服限制的少数情况之一。不幸的。