【问题标题】:MySQL RegExp Got error 'repetition-operator operand invalid' from RegExpMySQL RegExp 从 RegExp 得到错误“重复运算符操作数无效”
【发布时间】:2014-07-27 10:20:14
【问题描述】:

我的正则表达式是这样的:

((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?([a-z])

如果我将此作为 MySQL RegExp 的输入,我会收到重复运算符错误。我知道它的发生是因为 ?: 并且我用 ^ 替换了它,我还替换了 * ?用 [^>]* 我替换的正则表达式是这样的:

'((^[a-z][a-z0-9_]*)).[^>]*.(\\d+).[^>]*.((^[a-z][a-z0-9_]*)).[^>]*.(\\d+).[^>]*.([a-z])'

上面的表达式执行没有错误,但是匹配失败并返回错误的结果。所以我想将第一个正则表达式转换为mysql支持的POSIX标准而不丢失约束。

【问题讨论】:

  • MySQL 不支持 .*? 惰性量词
  • 是的,这就是我用 [^>]* 替换它的原因。
  • 仅供参考,添加了有关转换表达式的更改的说明。

标签: mysql sql regex


【解决方案1】:

需要的最重要的转换是模仿惰性量词,这在 MySQL 中不存在。为此,正如您将在解释的第 3 点中看到的那样,我们将使用相互不兼容的表达式。

应该这样做:

(([a-z][a-z0-9_]*))[^0-9]*([0-9]+)[^a-z]*(([a-z][a-z0-9_]*))[^0-9]*([0-9]+)[^a-z]*([a-z])

除非您打算使用它们,否则您还可以摆脱在 ([0-9]+) 等位置捕获括号(之前有 (\d+)。)

说明

  1. (?: 非捕获组替换为常规组
  2. \d 替换为[0-9]
  3. 将惰性量词替换为否定后面的字符类,例如 [^a-z]*[a-z] 之前,[^0-9]*[0-9] 之前

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-27
    • 2015-01-31
    • 2014-05-04
    • 2019-05-09
    • 2016-09-09
    • 2011-11-25
    • 2013-08-21
    • 2021-03-18
    相关资源
    最近更新 更多