请使用以下正则表达式示例:
如您所见,正则表达式效果很好,并且与产品说明中的尺寸(例如3/16英寸等)相匹配。
我正在尝试使用REGEXP_SUBSTR()
根据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
实际上用原始正则表达式解决了我的原始查询-只是以为我愿意分享这一点,以防它对其他人有帮助!
答案 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/]+)?
).
最好写成/
(字符类效率更高)