Sublime Text tmLanguage文件中的正则表达式不使用多行

时间:2015-09-07 13:52:14

标签: regex sublimetext2

我正在尝试创建一个自定义语法语言文件,以突出显示并帮助在Sublime Text 2中创建新文档。我已经走了很远,但我仍然遇到有关正则表达式搜索的特定问题tmLanguage文件。我只是希望能够在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
  

注意:我的正则表达式规则适用于测试人员,此问题仅发生在Sublime Text 2中的tmLanguage文件中。

非常感谢任何帮助。

编辑:我使用匹配而不是开始/结束子句的原因是因为我想使用捕获组为它们指定不同的名称。如果某人有一个包含开始和结束条款的解决方案,您仍然可以在其中命名为“foo”,“#12; 12345”和“#39; 12345'和' bar'不同的是,我也很好。

2 个答案:

答案 0 :(得分:2)

我发现这是不可能做到的。这直接来自TextMate Manual,这是Sublime Text基于的文本编辑器。

  

12.2语言规则

     

< ...>

     

请注意,正则表达式仅与一个匹配   一次一行的文件。这意味着无法使用   匹配多行的模式。原因是技术性的:   能够在任意行重启解析器并且必须   仅重新解析受编辑影响的最小行数。多数情况   在这种情况下,可以使用开始/结束模型来克服这种情况   限制。

我的情况是少数几个开始/结束模型无法克服限制的情况之一。不幸的。

答案 1 :(得分:0)

问了很长时间,但是您确定不能使用开始/结束吗?在开始更好地理解语法/逻辑之前,我在开始/结束时也遇到了类似的问题。这是我正在执行的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很不错。可能仍然会遇到一些错误,但是当我对主题一无所知时,可以用对我有用的方式对其进行解释。