Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 从字符串字段中提取数字,包括十进制(Postgres 9.5)_Regex_Postgresql - Fatal编程技术网

Regex 从字符串字段中提取数字,包括十进制(Postgres 9.5)

Regex 从字符串字段中提取数字,包括十进制(Postgres 9.5),regex,postgresql,Regex,Postgresql,假设我有一个字段: product_strength 10MG/ML 0.25MG 25MG 0.125MG 如何仅提取“数字”部分,然后转换为数字?我可以做到这一点:regexp\u replace(产品强度,(\D |!\),“,”g”)::结果为数值\u数值 但问题是它实际上并不能解释小数点。换言之,这将返回 product_strength result_numeric 10MG/ML 10 0.25MG 25 25MG

假设我有一个字段:

product_strength
10MG/ML
0.25MG
25MG
0.125MG
如何仅提取“数字”部分,然后转换为数字?我可以做到这一点:
regexp\u replace(产品强度,(\D |!\),“,”g”)::结果为数值\u数值

但问题是它实际上并不能解释小数点。换言之,这将返回

product_strength result_numeric
10MG/ML             10
0.25MG              25
25MG                25
0.125MG             125
但我想回去

product_strength result_numeric
10MG/ML             10
0.25MG              0.25
25MG                25
0.125MG             0.125
尝试使用正则表达式匹配数字

\d+\.?\d*
编辑:正如“布尔类型”所说,如果你也需要负数,你可以添加一个可选的负号,并使用

\-?\d+\.?\d*
尝试使用正则表达式匹配数字

\d+\.?\d*
编辑:正如“布尔类型”所说,如果你也需要负数,你可以添加一个可选的负号,并使用

\-?\d+\.?\d*

我将使用regexp_匹配:

select (regexp_matches(product_strength, '[0-9]+\.?[0-9]*'))[1]::numeric
from the_table

regexp\u matches()返回所有匹配字符串的数组,这就是为什么需要
[1]

我将使用regexp\u匹配:

select (regexp_matches(product_strength, '[0-9]+\.?[0-9]*'))[1]::numeric
from the_table

regexp\u matches()返回所有匹配字符串的数组,这就是为什么需要
[1]

此模式匹配空字符串
'
@a\u horse\u和\u no\u name这不匹配数字的所有实例。例如,
12a15b
=>
{12}
。我需要的是
{12,15}
。我尝试了
g
修饰符:
(regexp\u匹配(产品强度,[0-9]+\?[0-9]*','g'))
但这不起作用。此模式匹配空字符串
@a\u horse\u和\u no\u名称。此模式不匹配数字的所有实例。例如,
12a15b
=>
{12}
。我需要的是
{12,15}
。我尝试了
g
修饰符:
(regexp\u匹配(产品强度,[0-9]+\.?[0-9]*,'g'))
但这不起作用我的实际用例是在sqlalchemy中,我有:
sa.cast(sa.func.regexp\u匹配(col,'\d+\.?\d*')),sa.Numeric)
。如何访问sa.func.regexp\u matches返回的数组的第一个元素?我尝试了
sa.cast(sa.func.regexp\u匹配(col,“\d+\?\d*”)[0],sa.Numeric)
,但这并不管用,我实际上能够使用
子字符串
函数。所以这对我来说很有效:
substring(product\u-strength,'\d+\.?\d*)::numeric
或在sqlalchemy中:
sa.cast(sa.func.substring(col,'\d+\.?\d*),sa.numeric)
这个解决方案考虑了可能的负数:
-?\d+\.\d*
。我的实际用例是在sqlalchemy中,我有:
sa.cast(sa.func.regexp)(列“\d+\?\d*”),sa.Numeric)
。如何访问由
sa.func.regexp\u匹配项返回的数组的第一个元素
?我尝试了
sa.cast(sa.func.regexp\u匹配项(列“\d+\?\d*”)[0],sa.Numeric)
但这并不管用啊,不管怎样,我实际上能够使用
子字符串
函数。因此这对我来说很管用:
子字符串(产品强度,'\d+\.?\d*')::numeric
或在sqlalchemy中:
sa.cast(sa.func.substring(col,'\d+\.\d*'),sa.numeric)
此解决方案考虑了可能的负数:
\-?\d+\.?\d*