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

标签 regex postgresql

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

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只有尾随或前导的非数字字符。

最佳答案

这对你有用吗?

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

我假设 -0.07.5 无效(存在双点)。

D04 也会返回 false。

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

希望对您有所帮助。

关于regex - PostgreSQL,用于将文本字段与数值匹配的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42208849/

相关文章:

postgresql - 如何使用 libpq 的 pgpass 连接到 postgresql,而不指定纯文本密码?

ruby-on-rails - 高负载下薄悬挂

python - 如何在 python 中重新搜索()多个模式?

javascript - 从字符串中提取数字值

php - 从php中的电话号码中修剪国家代码

sql - 检查 PostgreSQL 中是否存在索引

node.js - 对 hasMany 计数为空的模型进行后续查询

html - Perl 正则表达式模式匹配

regex - 如何在匹配正则表达式的多个文件上运行脚本?

java - 无法提取结果集,列不存在