gpt4 book ai didi

python - lark 语法 : How does the escaped string regex work?

转载 作者:行者123 更新时间:2023-12-04 12:16:40 27 4
gpt4 key购买 nike

Lark 解析器预定义了一些常见的终端,包括一个字符串。它的定义如下:

_STRING_INNER: /.*?/
_STRING_ESC_INNER: _STRING_INNER /(?<!\\)(\\\\)*?/

ESCAPED_STRING : "\"" _STRING_ESC_INNER "\""

我明白 _STRING_INNER .我也明白如何 ESCAPED_STRING被创作。但我不太明白的是 _STRING_ESC_INNER .

如果我正确阅读了正则表达式,它只是说每当我找到两个连续的文字反斜杠时,它们前面不能有另一个文字反斜杠?

如何将这两者组合成一个正则表达式?

难道语法不需要只允许在字符串数据中转义双引号吗?

最佳答案

预赛:

  • .*?非贪婪匹配,意味着 . 的最短可能重复次数(任何符号)。这只有在后面跟着其他东西时才有意义。所以.*?X在输入 AAXAAX将仅匹配 AAX部分,而不是一直扩展到最后 X .
  • (?<!...)是“否定后视断言”( link ):“如果字符串中的当前位置前面没有...的匹配项,则匹配”。所以.*(?<!X)Y会匹配 AY但不是 XY .

  • 将此应用于您的示例:
  • ESCAPED_STRING :规则说:“匹配 ",然后是 _STRING_ESC_INNER,然后是 "”。
  • _STRING_INNER : 匹配任何符号的最短可能重复次数。如前所述,这仅在考虑后面的正则表达式时才有意义。
  • _STRING_ESC_INNER :我们希望它匹配不包含结束引号的最短字符串。也就是说,对于输入 "abc"xyz" ,我们要匹配 "abc" ,而不是同时消耗 xyz"部分。但是,我们必须确保 "确实是一个结束语,因为它本身不应该被转义。所以对于输入 "abc\"xyz" ,我们不想只匹配 "abc\" ,因为 \"被逃脱了。我们观察到收盘"必须直接在偶数 \ 前面(零是偶数)。所以"没问题,\\"没问题,\\\\"没问题等等。但尽快"前面是奇数 \ ,这意味着 "并不是真正的结束语。
    (\\\\)匹配 \\ . (?<!\\)说“之前的位置不应该有\”。如此结合(?<!\\)(\\\\)表示“匹配 \\ ,但前提是它前面没有 \ ”。

    以下*?然后做尽可能小的重复,这同样只有在考虑后面的正则表达式时才有意义,即 "来自 ESCAPED_STRING规则(可能的混淆点:\" 中的 ESCAPED_STRING 指的是我们想要匹配的实际输入中的文字 ",就像 \\\\ 指的是输入中的 \\ 一样)。所以(?<!\\)(\\\\)*?\"表示“匹配最短的 \\ 后面是 " 并且前面没有 \ 。所以换句话说, (?<!\\)(\\\\)*?\" 只匹配 " 前面是偶数个 |10467914|包括大小为 0 的块)。

    现在将它与前面的 \ 结合起来, _STRING_INNER规则然后说:匹配第一个 _STRING_ESC_INNER前面是偶数 " ,所以换句话说,第一个 \哪里"本身并没有逃脱。
  • 关于python - lark 语法 : How does the escaped string regex work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61372172/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com