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

ame*_*iel 3 regex postgresql

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

myfield   is_numeric
____________________
-4        true
0004      true
4.00      true
dog       false
D04       false
04f       false
Run Code Online (Sandbox Code Playgroud)

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

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

告诉我们该行是否包含有效数字。但是,我注意到该正则表达式的like D0404creturn 值true,对于我的用例来说,是误报。

为什么会这样呢?似乎^不一定要匹配整个值,而是要匹配值的任何有效子串。但是,类似的值D04f的确会返回false,因此即使字段中存在数字子字符串,^and $运算符的组合也能完成其工作。

我暂时求助于:

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

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

Edu*_*bar 8

这对您有用吗?

^-?[0-9]+\.?[0-9]*$
Run Code Online (Sandbox Code Playgroud)

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

D04 也会返回false。

在你原来的正则表达式的问题是,你不逃避的点,所以它会匹配任何characher,包括D在你的D04

希望能帮助到你。

  • 实际上这还不够好 `select '.5' ~ '^-?[0-9]+\.?[0-9]*$'` 是 false (2认同)