如何在 Sublime 包开发 YAML tmlanguage 中匹配以运算符分隔的字符串

How to match operator-separated strings in Sublime Package Development YAML tmlanguage

我正在使用 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"!";

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

使用

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

this regex demo

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

我发现了一个很好的实现方式,可以使用 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