我正在尝试创建一个自定义语法语言文件,以突出显示并帮助您在Sublime Text 2中创建新文档。我已经走了很远,但是我仍然遇到tmLanguage文件中与Regex搜索有关的特定问题。我只希望能够在YAML文档中的多行上匹配一个正则表达式,然后将其转换为PList以在Sublime Text中作为包使用。它不起作用。
This是我的正则表达式:
/(foo[^.#]*bar)/
这是tmLanguage YAML文档内部的外观:
patterns:
- include: '#test'
repository:
test:
comment: Tester pattern
name: constant.numeric.xdoc
match: (foo[^.#]*bar)
如果我将此YAML生成为tmLanguage文件,并将其用作Sublime Text中的包,则我将创建一个使用此自定义语法的文档,请尝试一下并发生以下情况:
此匹配项:
foo 12345 bar
这将不匹配:
foo
12345
bar
在a Regex tester中,它们应该并且都将匹配,但是在我的tmLanguage文件中,它不起作用。
我也已经尝试过在tmLanguage文件中的正则表达式中添加修饰符,但是以下内容不起作用或完全破坏了文档:
match: (/foo[^.#]*bar/gm)
match: /(/foo[^.#]*bar/)/gm
match: /foo[^.#]*bar/gm
match: foo[^.#]*bar
注意:我的Regex规则在测试器中有效,仅在Sublime Text 2中的tmLanguage文件中会出现此问题。
非常感谢您的帮助。
编辑:之所以使用匹配而不是开始/结束子句,是因为我想使用捕获组为它们赋予不同的名称。如果某人有一个带有begin和end子句的解决方案,您仍然可以用不同的方式命名'foo','12345'和'bar',那我也很好。
我发现这是不可能的。直接来自TextMate Manual,它是Sublime Text所基于的文本编辑器。
12.2语言规则
<...>
注意,正则表达式仅与单个匹配一次的文档行。这意味着无法使用匹配多行的模式。原因是技术上的:能够在任意行重新启动解析器,并且必须仅重新分析受编辑影响的最小行数。多数情况情况下,可以使用开始/结束模型来克服此问题限制。
我的情况是开始/结束模型无法克服限制的少数情况之一。不幸的。
自问了很长时间以来,但您确定不能使用开始/结束吗?在开始更好地理解语法/逻辑之前,我在开始/结束时也遇到了类似的问题。这是我正在执行的json tmLanguage文件的一个粗略示例(不知道正确的YAML语法)。
"repository": {
"foobar": {
"begin": "foo(?=[^.#]*)", // not sure about what's needed for your circumstance. the lookahead probably only covers the foo line
"end": "bar",
"beginCaptures": {
"0": {
"name": "foo"
}
},
"endCaptures": {
"0": {
"name": "bar"
}
},
"patterns": [
{"include": "#test-after-foobarmet"}
]
},
"test-after-foobarmet": {
"comment": "this can apply to many lines before next bar so you may need more testing",
"comment2": "you could continue to have captures here that go to another deeper level...",
"name": "constant.numeric.xdoc",
"match": "anyOtherRegexNeeded?"
}
}
我没有关注你
“我需要给'#'和'。之间的不同部分编号。字符。“
,但是如果需要在foo bar之间命名不同的组,则应该可以在test-after-foobarmet
中进行更多捕获的测试。
有好explanation of TextMate Grammar here。可能仍然会遇到一些错误,但是当我对主题一无所知时,可以用对我有用的方式进行解释。