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

Regex 正则表达式模式以生成适当的转义字符行为,regex,yaml,sublimetext3,syntax-highlighting,Regex,Yaml,Sublimetext3,Syntax Highlighting,我正在为语法突出显示制作一个崇高的文本3语言定义。该语言是一种简单的“表达式语言”(与Java无关),用于在显示面板上显示媒体库中的信息。语法突出显示的目的是明确显示在面板上的内容 因此,我想确切地解释一下在显示面板上解释和显示转义字符序列时的样子。转义字符是正斜杠,如果要显示文字正斜杠,必须用另一个字符转义。因此,一系列正斜杠将导致面板上每隔一个正斜杠显示一次。此外,如果正斜杠后面有一个特殊字符,它将被转义-但是如果一个特殊字符放在两个(或四个,或六个…)正斜杠后面,它将不会被转义,因为转义字

我正在为语法突出显示制作一个崇高的文本3语言定义。该语言是一种简单的“表达式语言”(与Java无关),用于在显示面板上显示媒体库中的信息。语法突出显示的目的是明确显示在面板上的内容

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

我希望实现的突出显示(以特殊字符为例)如下所示:

我必须通过提供YAML格式的升华文本正则表达式来实现这一点,因此解决方案必须是纯正则表达式


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

查找奇数的斜杠并不是特别有用。这是一个删除斜杠的解析练习。如果斜杠后面跟着另一个斜杠,它就是一个字面斜杠,否则它就是后面的任何东西

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

使用正则表达式匹配所有“slash anychar”对,并替换为捕获的字符

在java中:

str = str.replaceAll("/(.)", "$1");
在python中:

str = re.sub('/(.)', '$1', str)
在perl中:

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

etc

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

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

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

第三条规则是与有效转义序列相匹配的规则,即一个
/
后跟另一个
/
(literal
/
)或一个
s
(literal
s

最后一条规则是可选的,它匹配一个
/
字符,后跟任何不是有效转义字符的字符(包括没有后跟任何字符),并将其标记为
无效
,以提示用户他们做了傻事

在这里,为了检测无效转义,我添加了一个空格字符作为可能有效的转义符,以便裸
/
后面的尾随空格也不会得到
无效的
范围。否则,语法将假定您试图引用空格字符

%YAML 1.2
---
范围:source.example
上下文:
主要内容:
#一个简单的单行注释范围捕获,用于良好的输出
-匹配:“(#).*\n?”
捕获:
0:comment.line.number-sign.example
1:标点符号.definition.comment.example
#这样我们就可以给字母s涂上颜色,知道它什么时候“特别”
-比赛:“s”
范围:entity.name.special
#可以有效转义的一组事物
-匹配:'/[s/]'
范围:constant.character.escape.example
#如果只有s和/是有效转义,则使其他转义无效,包括
#使用一个空的/不带任何内容的文件。
-匹配:“/[^s/]”
作用域:无效。非法。转义。示例
在一个简单的测试中,此语法的结果将是:


好吧,不管它值多少钱,我都想出来了。这:

%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
给你这个:


您不需要奇数个斜杠。你想让一对斜杠变成一个字面斜杠,然后,单斜杠就是转义符。要是这么简单就好了!我在YAML,所以我需要一个纯正则表达式解决方案。我应该添加一个YAML标签。“我现在就要这么做了。@dan YAML和你的问题有什么关系?你不能在YAML中“做”任何事情——它是纯数据。请在你的问题中进一步解释你想做什么。也许说我“在YAML中”让人困惑,但我的观点是,我不是在编程任何东西——我是在向程序提供指令,这些指令是YAML格式的。指令包含正则表达式,如果我输入正确的正则表达式,程序将显示我所要求的行为。程序是Sublime Text 3,行为是语法高亮显示。所以我只需要一个纯正则表达式解决方案来选择我问题中描述的模式。谢谢。我可能会在紧要关头使用这个解决方案。。。不过,我现在明白了我是如何没有完全解释自己的(我对堆栈溢出、升华文本、YAML和Regex都是新手,所以我通常有点不知所措)。我已经修改了我的问题,明确了我想要达到的目标——我想这应该会让我明白——你介意看一看吗?为了清楚起见,你是否希望当你在文件中输入一些文本时