MySQL REGEXP_SUBSTR() 转义问题?
MySQL REGEXP_SUBSTR() escaping issue?
请看下面的正则表达式示例:
如您所见,正则表达式效果很好,与产品说明中的尺寸(例如 3/16" 等)相匹配。
我正在尝试使用 REGEXP_SUBSTR()
在 MySQL 8.0.15 中实现此功能
根据 documentation 我已经将转义字符加倍,但正则表达式不起作用。
请看下面SQL fiddle:
https://www.db-fiddle.com/f/e6Ez3XCdU5Ahs91z6TQA8P/0
如你所见,REGEXP_SUBSTR()
returns NULL
我假设这是一个逃逸问题 - 但我不是 100% 确定。
如何确保 MySQL returns 每个产品(行)的第一个匹配类似于 regexr.com 示例?
干杯
编辑:28/05/2019 - 根本原因
Wiktor 在下面的回答解决了我的问题,而且他的正则表达式更清晰,值得点赞。也就是说,我不明白为什么我的原始版本在从 SQL 服务器端口到 MySQL 后无法工作。今天早上我终于注意到了这个问题 - 它与正则表达式无关,这是字符串连接中的菜鸟错误!具体来说,我使用的是 UPPER(Description + ' ')
(即使用 +
)——它在 SQL 服务器中运行良好,但显然; MySQL强制数值!所以我基本上是 运行 我的正则表达式反对 0
!用 CONCAT
替换 +
实际上用原始正则表达式修复了我的原始查询 - 只是想我会分享这个以防它帮助其他人!
在支持ICU正则表达式的MySQL v8.x中,您可以使用
SELECT Description, REGEXP_SUBSTR(Description, '(?im)(?=\b(?:[0-9/]+(?:\.[0-9/]+)?\s*(?:[X-]|$)|[0-9/\s]+(?:\.[0-9/]+)?(?:[CM]?M|["”TH])))[0-9/\s.]+(?:[CM]?M|["”TH])?(?:\s*[/X-]\s*[0-9/\s.]+(?:[CM]?M|["”TH])?)?(?=[.\s()]|$)') AS Size FROM tbl_Example
要点:
- 标志可以用作内联选项,
(?mi)
、m
将在 ^
和 $
匹配一行的 start/end 时启用多行模式i
将启用不区分大小写模式
[$]
匹配一个 $
字符,要匹配行尾位置,需要将 $
移出字符 class,在此使用交替case ((?=[\.\s\(\)$])
-> (?=[.\s()]|$)
, 对,不用转义的也不转义)
- 匹配小数部分,最好使用类似
(?:\.[0-9/]+)?
的模式(它匹配可选的.
序列,然后是1个或多个数字或/
s)
(C|M)?
最好写成[CM]?
(一个字符class更有效率)
请看下面的正则表达式示例:
如您所见,正则表达式效果很好,与产品说明中的尺寸(例如 3/16" 等)相匹配。
我正在尝试使用 REGEXP_SUBSTR()
根据 documentation 我已经将转义字符加倍,但正则表达式不起作用。
请看下面SQL fiddle:
https://www.db-fiddle.com/f/e6Ez3XCdU5Ahs91z6TQA8P/0
如你所见,REGEXP_SUBSTR()
returns NULL
我假设这是一个逃逸问题 - 但我不是 100% 确定。
如何确保 MySQL returns 每个产品(行)的第一个匹配类似于 regexr.com 示例?
干杯
编辑:28/05/2019 - 根本原因
Wiktor 在下面的回答解决了我的问题,而且他的正则表达式更清晰,值得点赞。也就是说,我不明白为什么我的原始版本在从 SQL 服务器端口到 MySQL 后无法工作。今天早上我终于注意到了这个问题 - 它与正则表达式无关,这是字符串连接中的菜鸟错误!具体来说,我使用的是 UPPER(Description + ' ')
(即使用 +
)——它在 SQL 服务器中运行良好,但显然; MySQL强制数值!所以我基本上是 运行 我的正则表达式反对 0
!用 CONCAT
替换 +
实际上用原始正则表达式修复了我的原始查询 - 只是想我会分享这个以防它帮助其他人!
在支持ICU正则表达式的MySQL v8.x中,您可以使用
SELECT Description, REGEXP_SUBSTR(Description, '(?im)(?=\b(?:[0-9/]+(?:\.[0-9/]+)?\s*(?:[X-]|$)|[0-9/\s]+(?:\.[0-9/]+)?(?:[CM]?M|["”TH])))[0-9/\s.]+(?:[CM]?M|["”TH])?(?:\s*[/X-]\s*[0-9/\s.]+(?:[CM]?M|["”TH])?)?(?=[.\s()]|$)') AS Size FROM tbl_Example
要点:
- 标志可以用作内联选项,
(?mi)
、m
将在^
和$
匹配一行的 start/end 时启用多行模式i
将启用不区分大小写模式 [$]
匹配一个$
字符,要匹配行尾位置,需要将$
移出字符 class,在此使用交替case ((?=[\.\s\(\)$])
->(?=[.\s()]|$)
, 对,不用转义的也不转义)- 匹配小数部分,最好使用类似
(?:\.[0-9/]+)?
的模式(它匹配可选的.
序列,然后是1个或多个数字或/
s) (C|M)?
最好写成[CM]?
(一个字符class更有效率)