регулярное выражение для чисел с возможными цифрами после точки или запятой в тексте - PullRequest
0 голосов
/ 24 октября 2019

Мне нужно регулярное выражение, которое может отфильтровывать числа, которые могут иметь цифры после точки в тексте.

(?: [AZ] \ 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 возвращает только первую группу моего совпадения. Может кто-нибудь помочь мне, пожалуйста.

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

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Я думаю, вы должны использовать 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().

0 голосов
/ 24 октября 2019

Вы можете использовать комбинацию substring() и replace(), например:

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

substring() захватывает соответствующую часть строки, затем replace() заменяет , на . при необходимости.

Демонстрация по 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        
...