带有Concat的MariaDB正则表达式只能捕获一些结果



我有一个 VARCHAR 列的表,我需要检查它的值:

典型的数据值为:

Brize Norton (501, 622, 2624, 4624, 4626)
Wyton (7006, 7010, 7630)
Waddington (2503, 7006)
Honington (2623)
Marham (2620, 7010)
Leeming (607 & 609)

我需要检查的唯一部分是它只包含完整的数字。我不能检查数字,因为LIKE '%607%'也会错误地匹配60702607,所以我检查包装器的数量和变体如下:

我有这个查询:

SELECT id, name FROM aux WHERE aux.name REGEXP CONCAT('[(,h]',:num, '[),h]') 

这是为了捕捉VARCHAR列中的任何(( or, or <whitespace>a variable number value) or , or <whitespace>)。

这适用于某些数字,但不适用于其他数字;

一个例子:

:num = 2620
SELECT id, name FROM aux WHERE aux.name REGEXP CONCAT('[(,h]',:num, '[),h]')

结果:

"马哈姆(2620、7010)">

但在其他数字上失败:

:num = 7010
SELECT id, name FROM aux WHERE aux.name REGEXP CONCAT('[(,h]',:num, '[),h]')

结果:

(无)

我怎样才能告诉正则表达式捕获上述形状的数据( or, or <whitespace>a variable number value) or , or <whitespace>

我已经尝试EXPLAIN查询,但这对我了解 REGEXP 机制没有帮助。

我已经用s替换了h但这没有区别。

本质上,这是一个版本问题,因为直到版本10.0.5,MariaDB都使用符合POSIX 1003.2的正则表达式库。该库不支持hd等字符类,使用它们的 POSIX 变体 -[:alpha:][:digit:]等。

但是,在您的情况下,似乎您可能只是将该字符类中的单个空格替换sh

REGEXP CONCAT('[(, ]', :num, '[), ]')

您的MariabDB不支持PCRE正则表达式语法,因此只能使用符合POSIX的正则表达式。hs都不符合POSIX标准,在POSIX世界中,h"等同于"[:blank:]s

等同于[:space:]

更多 POSIX/PCRE 字符类等效模式

标符
POSIX 字符类PCRE说明
[:alnum:][:alnum:]/[p{L}p{N}]字母数字
[:alpha:]p{L}字母顺序
[:blank:]h空格
[:cntrl:][:cntrl:]/p{Cc}/p{C}控制角色
[:digit:]d位数字
[:graph:][:graph:]图形字符
[:lower:]p{Ll}小写字母
[:print:][:print:]图形或空格字符
[:punct:][p{P}p{S}]点符号
[:space:]s空格、制表符、换行符和回车
[:upper:]p{Lu}大写字母
[:xdigit:][:xdigit:]/[A-Fa-f0-9]十六进制数字

最新更新