我有一个类型为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
告诉该行是否包含有效数字。但是,我注意到D04
和04c
之类的值会为该正则表达式返回true
,对于我的用例,这是一个误报。
为什么会这样?似乎^
不一定匹配整个值,而是匹配值的任何有效子字符串。但是,D04f
之类的值会返回false
,因此即使字段中有数字子字符串,^
和$
运算符的组合也会正常运行。
我暂时使用:
SELECT id,
myfield
(myfield::varchar ~ '^-?[0-9]*.?[0-9]*$'
AND myfield::varchar !~ '[^0-9\-\.]') is_numeric
FROM mytable
但这似乎不合适(并且不排除双点),而且我仍然想知道为什么正则表达式正确排除以非数字字符开头和结尾的字符串,而对于包含字符串的字符串不正确地返回true只有一个尾随或前导非数字字符。
答案 0 :(得分:5)
这对你有用吗?
^-?[0-9]+\.?[0-9]*$
我认为-0.07.5
无效(存在双点)。
D04
也将返回false。
原始正则表达式中的问题是您没有转义该点,因此它会匹配任何字符,包括D
中的D04
。
希望它有所帮助。