【问题标题】:How to match operator-separated strings in Sublime Package Development YAML tmlanguage如何在 Sublime 包开发 YAML tmlanguage 中匹配运算符分隔的字符串
【发布时间】:2016-04-15 12:15:49
【问题描述】:

我正在使用 PackageDevelopment 的 .YAML-tmLanguage 为 sublime text 2 中的定制语言进行语法定义。现在我希望我的语法能够将字符串识别为非字符串。

示例代码行:

string name = "Chuck Norris";
string message = "I am " + name + ", don't mess with a \"ROCKSTAR\"!";

我的双引号字符串模式:

- comment: strings in double quotes
  match: (".+")
  captures:
    '1': {name: string.quoted.double.me}

模式捕捉到了什么:

字符串名称 = "Chuck Norris";
字符串消息 = "I am " + name + ", don't mess with a "ROCKSTAR"!";

上面的第 1 行是正确的,但第 2 行似乎涵盖了所有内容。

我想要的是:

字符串名称 = "Chuck Norris";
字符串消息 = "I am " + 名称 + ", don't mess with a "ROCKSTAR"!";

【问题讨论】:

  • 我以为你会告诉voila! it didn't worked!
  • @rock321987,真正属于你的 ROCKSTAR !! :)
  • @catzilla:如果你有string mes = "I am a \"rock\" start.";,rock 的建议将不起作用
  • 跨多行的原始字符串文字呢?你已经处理它们了吗(我相信它们必须有一个单独的块)。

标签: regex string sublimetext2 yaml tmlanguage


【解决方案1】:

您需要匹配所有不是" 的字符以及\+引号之间的任何字符的组合。

使用

"[^"\\]*(?:\\.[^"\\]*)*"

this regex demo

也可以写成"(?:[^"\\]|\\.)*"。它更易于阅读,但效率较低。

【讨论】:

  • 我发现这个答案正确且有用,但是我还发现了使用 YAML tmlanguage 说明符的更好实现。
  • 那你就可以发帖了。实际上,在开始/结束中,您可以使用嵌套规则,因此您可以将引号声明为开始和结束模式,然后对转义实体使用嵌套规则。
  • 是的,那是真的.. 你所说的正是我所做的。我使用了beginend。并且还使用了嵌套.. :)
【解决方案2】:

我发现了一个关于如何匹配运算符分隔的字符串以及匹配双引号字符串和使用 YAML 的一些附加功能的良好实现。

@Wiktor Stribiżewv 的回答也解决了这个问题,但我找到了一个很好的实现:

- comment: strings in double quotes
  name: string.quoted.double.hit
  begin: \"
  end: \"
  patterns:
  - comment: escape characters
    name: constant.character.escape.hit
    match: \\.

  - comment: special characters
    name: constant.character.hit
    match: \%.

这也匹配转义字符,如\"\n 和特殊字符%s%d

【讨论】:

    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2023-01-13
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多