MySQL RegExp从RegExp获得错误'repeatition-operator operand invalid'

时间:2014-06-06 07:53:47

标签: mysql sql regex

我的正则表达式是:

((?:[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标准,而不会丢失约束。

1 个答案:

答案 0 :(得分:2)

所需的最重要的转换是模仿延迟量词,这在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
  3. 替换[0-9]
  4. 用一个否定的字符类替换了延迟量词,否定了要遵循的内容,例如[^a-z]*先于[a-z],而[^0-9]*先于[0-9]