gpt4 book ai didi

regex - 是否可以将多个Heredoc表达式与正则表达式匹配?

转载 作者:行者123 更新时间:2023-12-04 08:47:57 26 4
gpt4 key购买 nike

是否有任何正则表达式引擎可让我匹配表达式上的多个heredoc字符串?例如,就像用Ruby编写的那样:

f <<FOO, 10, <<BAR, 20
some text
FOO
some more text
BAR

我坚决使用Perl风格的backrefs和递归调用,但是无法使 cross-serial dependencies正常工作(即,无法反转捕获的backrefs,因为 FOO应该在 BAR之前匹配)。我还想到了在.Net上平衡组,我 可以通过使用lookaheads来反转堆栈(我知道,这是 可怕的 hack),如下所示:
(?:(?<x>foo|bar|baz)|\s)+(?(x)|(?!))\s*(?(x)(?=(.*?)(?<-x>(?<y>\k<x>)))){3}(?(x)(?!))(?:(?(y)(?<-y>\k<y>))|\s)+(?(x)(?!))(?(y)(?!))

(单击 here进行测试。)

这与 foo bar baz foo bar baz匹配,但是随后我必须添加一个手动计数器( {3}),因为前瞻性不会与 +重复,因为它不会消耗我假定的任何输入。因此,这不适用于任意情况(但是很接近!)。我当然可以用 {1000}或其他任何大数字代替它,这将回答我的问题,但是我想知道是否还有其他方法。

致谢:我知道将此类构造与正则表达式匹配不是一个好主意。我正在对此进行研究,我想知道是否有可能。如果是,请输入 please do not use it in production code

最佳答案

由于您的主要问题是“正则表达式是否可能”,因此我想从分享我最喜欢的正则表达式信息站点开始。具体来说,How does the regex engine work?学习可以使您更好地了解正则表达式的工作原理,以及为何尝试摆脱定义明确的框框的原因,很快就会演变成 splinter 的灵魂和CPU。

尽管关键之处在于,正则表达式引擎在任何时候都只有2条信息。

  • 我要匹配什么 token ?
  • 字符串中的下一个标记是什么?

  • 这很容易忘记,因为与 Steam 解析不同,正则表达式引擎在匹配失败时可以回溯(通常它会做很多事情)。而且CPU的速度足够快,每秒可能会导致数百万次故障!尽管Regex可能具有更多的存储空间,因为它可以匹配“dog之后的第一只猫”,但它只知道看到了“dog”一词,因为它目前正在cat中寻找c。或者换句话说,当前状态仅可能因为满足特定的先决条件才可能。

    通过模式的有限数量的排列,足够长的正则表达式可以匹配任何内容。 (该正则表达式的长度可能会使灵魂/CPU崩溃,但在技术上是可能的)

    模式不是有限的,例如“匹配数量相等的 a后跟相等数量的 b s”(例如“ab”,“aabb”,“aaabbb”等)。Regex没有机制来记住已看到多少个a,所以它不知道要匹配多少个b。您可以通过尝试匹配所有变体( ab|aabb|aaabbb|aaaabbbb|...)来解决此问题,但是解析起来会非常昂贵,而且由于我总是可以再添加一个Ab对,因此您将无法捕获每个有效输入。

    所以说真的,你需要问自己两个问题
  • 我是否想匹配有限数量的排列?
  • 我的灵魂/CPU能否在这种正则表达式中生存?

  • 相关的,您可能应该阅读 Nondeterministic finite automaton。由于您出于研究原因而询问,并且任何纯正则表达式引擎都是NDFA,因此有助于了解它们遭受相同的已知限制。

    TL:DR;

    使用纯正则表达式引擎...

    实际上,是的,但是要付出灵魂的代价。
    从理论上讲,不,完全没有。总是有一个有效的情况,您的正则表达式将失败。

    关于regex - 是否可以将多个Heredoc表达式与正则表达式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38688009/

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