PostgreSQL,正则表达式,用于将文本字段与数值匹配

时间:2017-02-13 16:26:03

标签: regex postgresql

我有一个类型为text的列,其中包含随机值。其中一些是数字,一些其他文本,以及一些其他混合文本和数字。我试图将它们区分为:

myfield   is_numeric
____________________
-4        true
0004      true
4.00      true
dog       false
D04       false
04f       false

而其他人则是名字和其他字符串。我正在使用正则表达式

SELECT id,
       myfield 
       (myfield::varchar~ '^-?[0-9]*.?[0-9]*$') is_numeric 
FROM mytable

告诉该行是否包含有效数字。但是,我注意到D0404c之类的值会为该正则表达式返回true,对于我的用例,这是一个误报。

为什么会这样?似乎^不一定匹配整个值,而是匹配值的任何有效子字符串。但是,D04f之类的值会返回false,因此即使字段中有数字子字符串,^$运算符的组合也会正常运行。

我暂时使用:

SELECT id, 
       myfield
       (myfield::varchar ~ '^-?[0-9]*.?[0-9]*$' 
       AND myfield::varchar !~ '[^0-9\-\.]') is_numeric 
FROM mytable

但这似乎不合适(并且不排除双点),而且我仍然想知道为什么正则表达式正确排除以非数字字符开头和结尾的字符串,而对于包含字符串的字符串不正确地返回true只有一个尾随或前导非数字字符。

1 个答案:

答案 0 :(得分:5)

这对你有用吗?

^-?[0-9]+\.?[0-9]*$

我认为-0.07.5无效(存在双点)。

D04也将返回false。

原始正则表达式中的问题是您没有转义该点,因此它会匹配任何字符,包括D中的D04

希望它有所帮助。