首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >崇高文本tmLanguage文件中的Regex不使用多行

崇高文本tmLanguage文件中的Regex不使用多行
EN

Stack Overflow用户
提问于 2015-09-07 13:52:13
回答 2查看 1.3K关注 0票数 4

我正在尝试创建一个自定义语法语言文件,以突出显示和帮助在崇高文本2中创建新文档。我已经取得了很大的进步,但是我在tmLanguage文件中遇到了一个关于Regex搜索的特定问题。我只是希望能够匹配YAML文档中多行的正则表达式,然后将其转换为PList,以便作为包在崇高文本中使用。恐怕行不通。

是我的准则:

代码语言:javascript
复制
/(foo[^.#]*bar)/

这就是它在tmLanguage YAML文档中的样子:

代码语言:javascript
复制
patterns:
- include: '#test'

repository:
  test:
    comment: Tester pattern
    name: constant.numeric.xdoc
    match: (foo[^.#]*bar)

如果我将这个YAML文件编译到一个tmLanguage文件中,并将它作为一个包使用崇高文本,我将创建一个使用这种自定义语法的文档,然后尝试它,然后发生以下情况:

这将匹配:

代码语言:javascript
复制
foo 12345 bar

这是不匹配的:

代码语言:javascript
复制
foo
12345
bar

Regex测试仪中,它们应该并且都会匹配,但是在我的tmLanguage文件中它不能工作。

我还试图在tmLanguage文件中向regex添加修饰符,但以下内容要么无法工作,要么完全破坏了文档:

代码语言:javascript
复制
match: (/foo[^.#]*bar/gm)
match: /(/foo[^.#]*bar/)/gm
match: /foo[^.#]*bar/gm
match: foo[^.#]*bar

注意:我的Regex规则在测试器中工作,这个问题只发生在tmLanguage文件中的Sublime 2中。

任何帮助都是非常感谢的。

编辑:我使用一个匹配,而不是开始/结束子句,是因为我想使用捕获组给他们不同的名字。如果有人有一个解决方案的开始和结束子句,你仍然可以命名'foo','12345‘和'bar’,这对我来说也没关系。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-08 10:01:48

我发现这是不可能的。这是直接从TextMate手册,这是文本编辑器崇高文本是基于。

12.2语言规则 <...> 注意,正则表达式一次只与文档的一行匹配。这意味着不可能使用匹配多行的模式。其原因是技术性的:能够在任意行重新启动解析器,并且只需要重新解析受编辑影响的最小行数。在大多数情况下,可以使用开始/结束模型来克服这一限制。

我的情况是少数几个不能克服这种限制的开始/结束模型。不幸的是。

票数 3
EN

Stack Overflow用户

发布于 2019-11-14 21:52:59

问了很久了,但您确定不能使用begin/end吗?在更好地掌握语法/逻辑之前,我在begin/end上也遇到了类似的问题。下面是我正在做的json tmLanguage文件中的一个粗略示例(不知道正确的YAML语法)。

代码语言:javascript
复制
"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?"
}

}

我没有跟着你的

“我需要对'#‘和'.’字符之间的不同部分进行编号。”

,但是您应该能够在test-after-foobarmet中进行测试,如果需要的话,可以在for之间命名不同的组。

有很好的TextMate语法解释。也许仍然会有一些错误,但是当我对这个话题一无所知的时候,解释它对我是有帮助的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32440333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档