产生适当的转义字符行为的正则表达式模式

Regex pattern to produce appropriate escape character behavior

我正在为语法高亮制作 Sublime Text 3 语言定义。该语言是一种简单的 'expression language'(与 Java 无关),用于在显示面板上显示来自媒体库的信息。语法突出显示的目的是明确面板上将显示的内容。

因此,我想确切地解释一下转义字符序列在显示面板上被解释和显示时的样子。转义字符是一个正斜杠,如果你想显示一个文字正斜杠,你必须用另一个转义它。因此,一系列正斜杠将导致面板上每隔一个正斜杠显示一次。此外,如果在正斜杠后有一个特殊字符,它将被转义 - 但如果一个特殊字符放在两个(或四个,或六个......)正斜杠之后,它不会被转义,因为转义字符会相互抵消。

我想实现的高亮效果(以特殊字符为例's')如下:

我必须通过以 YAML 格式提供 Sublime Text 正则表达式来实现这一点,因此解决方案必须是纯正则表达式。

这可能吗?如果是这样,我该如何实现?

查找奇数个斜杠不是特别有用。这是一个删除斜杠的解析练习。如果斜杠后跟另一个斜杠,则为字面斜杠,否则为后面的任何内容。

但是等一下,那里没有区别 - 不管后面的字符是什么,它都是文字,所以...

使用正则表达式 /(.) 匹配所有 "slash-anychar" 对并替换为捕获的字符。

在java中:

str = str.replaceAll("/(.)", "");

在python中:

str = re.sub('/(.)', '', str)

在 perl 中:

$str =~ s/\/(.)//

等等

如果没有关于您当前拥有的语法结构的更多信息,很难确定,但我认为您在这里寻找的只是一个简单的单一 match 结构,它与文字相匹配字符 / 后跟任何允许作为转义字符的字符,在您的示例中是字符 s 和字符 /.

您可能会认为您尝试创建的正则表达式需要找到包含转义序列任意组合的最大可能匹配项。但是,您提供的 match 规则会根据使用输入的需要多次使用,因此它们一次只需要匹配单个语法结构。

一个简单的例子就是下面的最小语法。前两个 match 结构仅用于下图中的示例目的;他们实现了行注释,并在未转义时将 's' 标记为特殊,以便在这种情况下更清楚。

第三条规则匹配有效的转义序列,即 / 后跟另一个 /(文字 /)或 s(文字s).

最后一条规则是可选的,它匹配一个 / 字符后跟任何不是有效转义字符的字符(包括后面没有跟任何字符)并将其标记为 invalid 作为提示告诉用户他们做了一些愚蠢的事情。

这里我添加了一个 space 字符作为潜在的有效转义,用于检测无效的转义,这样 / 后面的尾随 space 就不会被检测到invalid 范围也是如此。没有它,语法假定您试图引用 space 字符。

%YAML 1.2
---
scope: source.example
contexts:
  main:
    # A simple single-line comment scope capture for nice output
    - match: '(#).*\n?'
      captures:
        0: comment.line.number-sign.example
        1: punctuation.definition.comment.example
    # Just so we can apply a color to the letter s to know when it's "special"
    - match: 's'
      scope: entity.name.special
    # The set of things that can be valid escapes
    - match: '/[s/]'
      scope: constant.character.escape.example
    # If only s and / are valid escapes, make other escapes invalid, including
    # using a bare / with nothing following it.
    - match: '/[^s/ ]?'
      scope: invalid.illegal.escape.example

在简单测试中,此语法的结果为:

好吧,不管它值多少钱,我都明白了。这个:

%YAML 1.2
---

file_extensions:
  - example

  scope: source.example

  contexts:
    main:
    # special color setup #

    - match: s
      scope: green


    # desired behaviour #

      - match: '(/)(.)?'
        captures:
          1: grey
          2: white

给你这个: