【问题标题】:Regular Expressions particualrs for VSCode Syntax Highlighting [duplicate]用于 VSCode 语法突出显示的正则表达式
【发布时间】:2018-01-31 20:10:18
【问题描述】:

我正在尝试为 VSCode 编写一个 sytnax 荧光笔,它使用 TextMate 格式。我有一个单行 cmets 条目,从一个示例中复制而来,它工作正常,但我想扩展/修改它。

"linecomment": {
            "name": "comment",
            "match": "(%)(?!(\\[=*\\[|\\]=*\\])).*$\n?",
            "captures": {
                "1": {
                    "name": "comment"
                }
            }
        },

问题是,这里使用的正则表达式在我能找到的任何地方都没有记录。我了解基本的 Grep 和正则表达式背后的理论,但我不知道 ?!(\\[=*\\[|\\]=*\\])).*$\n? 中发生了什么。特别是,我不知道哪些字符在正则表达式语言中,哪些正在被匹配。

谁能给我解释一下:

  1. 这里使用了哪种正则表达式格式,它的文档记录在哪里?
  2. 给定的正则表达式是什么意思,它的部分是什么?

【问题讨论】:

标签: regex visual-studio-code syntax-highlighting textmate textmatebundles


【解决方案1】:

我不知道(1)的答案,但(2)的答案如下:

首先,如果您只使用了 grep 而没有使用其他风格的正则表达式,那么您应该知道存在一些语法差异。例如,在大多数风格中,\+ 是文字 ++ 是量词;在 grep 中,+ 是文字,\+ 是量词。还有其他字符,\的意思就是这样颠倒过来的。

其次,由于反斜杠转义,字符串文字与字符串本身不同。字符串文字如下所示:

"(%)(?!(\\[=*\\[|\\]=*\\])).*$\n?"

而字符串本身看起来像这样:

(%)(?!(\[=*\[|\]=*\])).*$
?

(末尾有一个换行符)。

让我们看看下面的子表达式:

\[=*\[|\]=*\]

起初我以为这是一个字符类,由\[\] 分隔。但是(a)我不知道任何正则表达式的味道,其中反斜杠转义方括号是字符类分隔符,非转义方括号是文字方括号,反之亦然; (b) 为什么有人会写一个包含重复字符的字符类? (c) 第一个 \] 是文字 ] 而第二个将结束字符类没有明显的理由。所以看起来\[\] 是方括号。

| 在正则表达式中表示“或”。它是一个低优先级运算符。所以这个子表达式表示\[=*\[\]=*\]。也就是说,它匹配[[[=[[======[等字符串,以及]]]=]等字符串。

(?!...) 是一个零宽度断言。这是一个否定的前瞻:它匹配字符串中肯定的前瞻(?=...)匹配的任何点。一般来说,如果正则表达式 A 匹配字符串 a 并且 C 匹配字符串 c 则正则表达式 A(?!B)C 匹配字符串 ac除非正则表达式 B匹配c(或c 的某个子字符串)。换句话说,如果字符串类似于%]==],则匹配失败。

.* 匹配任意数量的字符。 (0 是一个数字)。 (我假设这与换行符不匹配。)$ 是另一个零宽度断言:它只能在行尾匹配。实际上,在这种情况下不需要它 - .* 子表达式是贪婪的,并且会匹配所有非换行符,所以 .* 匹配的结尾保证是行尾。也就是说,除非有一些我不知道涉及回车或一些更奇特的行终止字符的边缘情况。

最后,\n? 将匹配换行符本身,如果它存在的话(? 是一个量词)。如果这是字符串的最后一行,则可能没有换行符;在这种情况下,如果没有 ?,正则表达式匹配将失败。

将它们放在一起:正则表达式将从% 匹配到行尾,包括换行符(如果存在),除非它尝试匹配的字符串以%[[%]==] 或其他东西开头类似。

【讨论】:

    猜你喜欢
    • 2017-03-11
    • 2017-05-11
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 2013-06-16
    • 2017-01-19
    相关资源
    最近更新 更多