文本中点或逗号后可能有数字的正则表达式

regex for numbers with possible digits after dot or comma in text

我需要一个正则表达式来过滤掉文本中点后可能有数字的数字。

(?:[A-Z]\s)(\d+)((.|,)(\d+))?

Text : Expected results : Actual Results
H 24    : 24            : 24
24.5    : 24.5          : 24
24,5    : 24.5          : 24
test5   : 5             : 5
test 5.5: 5.5           : 5
50.752  : 50.752        : 50

出于某种原因PG只returns我比赛的第一组。有人可以帮帮我吗

select substring('test 5.5', cast('(?:[A-Z]*\s*)(\d+)((.|,)(\d+))?' as character varying)) as convertedvalue

您可以使用 substring()replace() 的组合,例如:

select x, replace(substring(x, '(\d+(.|,)*\d*)'), ',', '.') convertedvalue

substring() 捕获字符串的相关部分,然后 replace() 在需要时将 , 替换为 .

Demo on DB Fiddle

with t(x) as ( values ('H 24'), ('24.5'), ('24,5'), ('test5'), ('test 5.5'), ('50.752') )
select x, replace(substring(x, '(\d+(.|,)*\d*)'), ',', '.') convertedvalue
from t
x        | convertedvalue
:------- | :-------------
H 24     | 24            
24.5     | 24.5          
24,5     | 24.5          
test5    | 5             
test 5.5 | 5.5           
50.752   | 50.752        

我想你应该可以使用 substring() 来做这个:

with t(x) as (
       values ('H 24'),
              ('24.5'),
              ('24,5'), 
              ('test5'),
              ('test 5.5'), 
              ('50.752'),
              ('50.,752'),
              ('H50.12,')
      )
select x, substring(x, '[0-9]+[.,]?[0-9]*') as convertedvalue
from t;

请注意,这会处理 CTE 中最后两个示例等情况。

如果你想用'.'替换','s,那么你可以在之后使用额外的replace()