MySQL REGEXP_SUBSTR()转义问题?

时间:2019-05-24 09:43:41

标签: mysql regex icu

请使用以下正则表达式示例:

https://regexr.com/4ek7r

如您所见,正则表达式效果很好,并且与产品说明中的尺寸(例如3/16英寸等)相匹配。

我正在尝试使用REGEXP_SUBSTR()

在MySQL 8.0.15中实现此功能

根据documentation,我已经将转义符加倍,但是正则表达式无法正常工作。

请参见以下SQL小提琴:

https://www.db-fiddle.com/f/e6Ez3XCdU5Ahs91z6TQA8P/0

如您所见,REGEXP_SUBSTR()返回NULL

我想这是一个逃生问题-但我不确定100%。

如何确保MySQL返回与regexr.com示例类似的每个产品(行)的第一个匹配项?

欢呼

编辑:2019年5月28日-根本原因

Wiktor在下面的回答解决了我的问题,他的正则表达式更干净而且值得投票。就是说,从SQL Server移植到MySQL之后,我不明白为什么我的原始版本不起作用。我终于在今天早上注意到了这个问题-与正则表达式无关,这是字符串连接中的菜鸟错误!具体来说,我使用的是UPPER(Description + ' ')(即使用+)-在SQL Server中工作正常,但显然; MySQL强制数字!因此,我实际上是针对0运行我的正则表达式!将+替换为CONCAT实际上用原始正则表达式解决了我的原始查询-只是以为我愿意分享这一点,以防它对其他人有帮助!

1 个答案:

答案 0 :(得分:1)

在支持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匹配行的开始/结束且{{1}时,^$将启用多行模式}}将启用不区分大小写的模式
  • i匹配一个[$]字符,以匹配行尾,您需要将$移出一个字符类,在这种情况下,请使用替换({{1} }-> $,是的,也不要逃避那些不必逃避的东西。
  • 匹配小数部分,最好使用类似(?=[\.\s\(\)$])的模式(它匹配(?=[.\s()]|$)的可选序列,然后匹配1个或多个数字或(?:\.[0-9/]+)?
  • .最好写成/(字符类效率更高)