【问题标题】:How to convert a PCRE to a POSIX RE?如何将 PCRE 转换为 POSIX RE?
【发布时间】:2010-05-14 21:18:58
【问题描述】:

这个有趣的问题Regex to match anything (including the empty string) except a specific given string 涉及如何在 MySQL 中进行负前瞻。发帖人想要得到的效果

Kansas(?! State)

因为 MySQL 没有实现前瞻断言,所以很多答案都等价

Kansas($|[^ ]| ($|[^S])| S($|[^t])| St($|[^a])| Sta($|[^t])| Stat($|[^e]))

发帖人指出,这是一个 PITA 可以处理潜在的大量表达。

是否有 PCRE(或其他包)的脚本/实用程序/模式可以将 PCRE(如果可能)转换为不使用 Perl 时髦特性的等效正则表达式?我完全清楚一些 Perl 风格的正则表达式不能被说成是一个普通的正则表达式,所以我当然不希望这个工具做不可能的事!

【问题讨论】:

  • 几年前我看到了一个将正则表达式转换为 NFA 或 DFA 并返回到正则表达式的工具,但我现在找不到它。该工具允许输入正则表达式中的交集和补集,而 IIRC 重构的正则表达式没有使用这些构造。
  • 值得注意的是,问题中的两个正则表达式并不完全相同:尽管它们在原始示例中的作用相同,但在某些情况下它们的行为会有所不同。例如,如果在替换中使用(例如,将字符串 Kansas Starbucks 中的 Kansas 替换为 Home),第一个将给出 Home Starbucks,而第二个将给出 Homebucks。在这方面,不可能有一个标准的 POSIX 正则表达式来完全模仿负前瞻。

标签: regex posix


【解决方案1】:

你不想这样做。将高级功能转换为基本功能实际上并不难——它只是编译器的另一种风格,编译器编写者是非常聪明的人——但是时髦的功能解决的大多数事情都是(a)不可能用标准正则表达式,因为它们识别非常规语言,因此您必须对它们进行近似,以便至少它们适用于有限长度的文本或(b)可能,但只能使用指数大小的正则表达式。而“指数”是compsci-speak的“不要去那里”。如果您尝试对您实际想要处理的任何事情使用指数解决方案,您陷入 OutOfMemory 错误和看似无限的循环中。

换句话说,放弃所有希望,你们进入这里。让正则表达式做它擅长的事情并用其他工具做其余的事情几乎总是更好。即使是像反转正则表达式这样简单的事情,使用原始正则表达式与否定运算符相结合也比使用精确的正则表达式逆变器产生的怪物要容易得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    相关资源
    最近更新 更多