Regex - извлечение чисел из строки

Я хочу создать REGEX DEFINITION в Oracle SQL, который вернет некоторое количество строк с числом с плавающей запятой из строки. Как это сделать?

case1 (n = 4: 48-48h, 72-72h, 96-96h, 120-120h)

n = 4> 4 записей на диапазон, полученные значения будут: 48,00, 72,00, 96,00 120,00

case2 (n = 5: 0-0h, 24,21-24.21h, 47,77-47.75h, 71,75-71.75h, 96,08-96.08h)

n = 5> 5 записей на диапазон, полученные значения будут: 00.00, 24.21, 47.77, 71.75, 96.08

Вход:

select REGEXP_SUBSTR('(n=4: 48-48h, 72-72h, 96-96h, 120-120h)', MY_REGEX_DEFINITION ) as X from dual;

выходные строки:

X
48.00
72.00
96.00
120.00

Пожалуйста, покажите свой образец ввода и ожидаемый результат!

Pham X. Bach 17.09.2018 10:27

Пожалуйста, покажите свой образец ввода и ожидаемый результат!

nikhil sugandh 17.09.2018 10:31

ваш входной sql не работает, что именно вы хотите?

nikhil sugandh 17.09.2018 11:06

Я хочу определить MY_REGEX_DEFINITION в SQL.

Cugar 17.09.2018 11:10
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
4
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел пример того, как разбить строку, так как вам сначала нужно сделать это, чтобы найти все числа в строке. Вот моя переработка этого примера, чтобы он соответствовал вашему вопросу. К сожалению, он возвращает пустую строку в конце, но это должно быть что-то для начала.

SELECT CAST(REGEXP_SUBSTR(result_row, '[^=]\d+\.?\d*' ) AS NUMBER)
FROM (
    SELECT 
        TRIM(REGEXP_SUBSTR('(n=5: 0-0h, 24.21-24.21h, 47.77-47.75h, 71.75-71.75h, 96.08-96.08h)', '[^ ]+h', 1, lines.column_value)) result_row
    FROM dual,
    TABLE (CAST (MULTISET
        (SELECT LEVEL FROM dual
            CONNECT BY instr('(n=5: 0-0h, 24.21-24.21h, 47.77-47.75h, 71.75-71.75h, 96.08-96.08h)', '-', 1, LEVEL - 1) > 0
        ) AS sys.odciNumberList ) ) lines
    ORDER BY  lines.column_value)//

Это статья Я взял пример кода из.

Я обнаружил две ошибки: из пары 22.21-24.21h запрос возвращает второе число, а не первое. Для '(n = 2: 0-0h, 24.09-0h)' запрос вернет только одну строку со значением 0.

Cugar 18.09.2018 12:17

Из вашего вопроса не было ясно, что вам нужно первое число, а второе было легче всего сопоставить из-за буквы «h».

Joakim Danielson 18.09.2018 12:26

@Cugar, я обновил шаблоны, чтобы они соответствовали обоим вызовам REGEXP_SUBSTR, так что возвращается первое число. По-прежнему возвращена одна дополнительная пустая строка.

Joakim Danielson 18.09.2018 12:50

Я выделил первый номер жирным шрифтом. Спасибо, теперь работает :)

Cugar 18.09.2018 13:02

Как изменить этот SQL, чтобы он также работал с case '(n = 3: 0-0h, 0,05-0,05h, -0,11- -0,12h)'? Теперь он возвращает только положительные числа: 0, 0,05 и 0,11, а не -0,11.

Cugar 18.09.2018 13:41

... и как вернуть только строки, когда значение x <y во всех парах чисел (например, 24.21-24.22h) в строке. Заранее спасибо!

Cugar 18.09.2018 15:53

Другие вопросы по теме