MySQL RegExp 从 RegExp 中得到错误“重复运算符操作数无效”

use*_*360 2 regex mysql sql

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

((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?([a-z])
Run Code Online (Sandbox Code Playgroud)

如果我把它作为 MySQL RegExp 的输入,我会得到重复操作符错误。我知道它是因为 ?: 发生的,我用 ^ 替换了它,我也替换了 * ? 用 [^>]* 我替换的正则表达式是这样的:

'((^[a-z][a-z0-9_]*)).[^>]*.(\\d+).[^>]*.((^[a-z][a-z0-9_]*)).[^>]*.(\\d+).[^>]*.([a-z])'
Run Code Online (Sandbox Code Playgroud)

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

zx8*_*x81 6

需要的最重要的转换是模仿惰性量词,它在 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])
Run Code Online (Sandbox Code Playgroud)

除非你打算使用它们,否则你也可以摆脱在诸如([0-9]+)(你以前有(\d+)过的地方)之类的地方捕获括号。

解释

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