【发布时间】: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 正则表达式来完全模仿负前瞻。