我有一列文本类型,其中包含随机值。其中一些是数字,一些是其他文本,还有一些是其他混合文本和数字。我试图将它们区分为:
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-9]+\.?[0-9]*$
我假设 -0.07.5
无效(存在双点)。
D04
也会返回 false。
原始正则表达式中的问题是您没有转义点,因此它将匹配任何字符,包括 D04
中的 D
。
希望对您有所帮助。
关于regex - PostgreSQL,用于将文本字段与数值匹配的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42208849/