我正在尝试编写Postgres正则表达式来查找列只有数字且字符串长度超过5的记录。
例如:列hello
有'0 1 1 2 1'
或'12345'
。
或者为了保持简单,我想要一个能够识别其中包含5个或更多数字的行的常规快递。
我该如何编写正则表达式?
答案 0 :(得分:1)
SELECT *
FROM (
VALUES
('98765')
,('1 2 3 4 5')
,('143562465')
,(' 1 2 5 3 235')
,(' 1 2 5 3 235s')
,('y 1 2 5 3 235')
,('245no')
,('1234')
) sub(hello)
WHERE hello ~ '^[\d ]+$'
AND length(translate(hello, ' ','')) > 4
结果:
98765
1 2 3 4 5
143562465
1 2 5 3 235
\d
..正则表达式为[数字]字符类的速记
[\d ]
..数字或空格
^
...开始刺痛
$
..字符串结尾
translate()
是替换单个字符的最快方法,在本例中只是空格。
如果您正在寻找单一正则表达式(可能比上述速度慢):
WHERE hello ~ '^ *(\d *){5,}$'
说明:
*
..零或多个空格
(\d *)
..由一个数字组成,后跟零个或多个空格字符的原子
{5,}
..前一个原子5次或更多次