Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Oracle |
![]() ![]() |
Elic Member Откуда: 1984. Выбраковка финно-угром началась. КЯЗ Сообщений: 27846 |
Собственно, нужен функционал разбора строки на компоненты регулярными выражениями, аналогичный:declare fBackreferences owa_text.vc_arr; begin if owa_pattern.match ( ' 10 20 30 40 50 60 70 80 90 1010 1111', '^ +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(.*)$', fBackreferences ) then dbms_output.put_line('09th backreference = '''||fBackreferences( 9)||''''); dbms_output.put_line('10th backreference = '''||fBackreferences(10)||''''); dbms_output.put_line('11th backreference = '''||fBackreferences(11)||''''); else dbms_output.put_line('Not matched'); end if; end; / 09th backreference = '90' 10th backreference = '1010' 11th backreference = '1111' PL/SQL procedure successfully completed.Но возможности owa_pattern слишком ограничены. select 'Matched' as status from dual where regexp_like ( ' 10 20 30 40 50 60 70 80 90 1010 1111', '^ +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(.*)$' ); STATUS ------- Matched select regexp_replace ( ' 10 20 30 40 50 60 70 80 90 1010 1111', '^ +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(\d+) +(.*)$', '\9' ) as "9th_backreference" from dual; 9t -- 90Но Oracle поддерживает только \1 - \9. Как можно получить 10-ую (и далее) скобку? |
30 сен 08, 18:46 [6247605] Ответить | Цитировать Сообщить модератору |
Denis Popov Member Откуда: Санкт-Петербург Сообщений: 7855 |
select rownum + 8 backreference , regexp_replace(v, '^(\s+\d+\s+){'||(rownum+8)||'}(\s+)(\d+).*', '\3') value from (select ' 10 20 30 40 50 60 70 80 90 1010 1111' v from DUAL) connect by level <= 2; Posted via ActualForum NNTP Server 1.4 |
30 сен 08, 19:17 [6247690] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: 1984. Выбраковка финно-угром началась. КЯЗ Сообщений: 27846 |
Это всего лишь пример регулярного выражения. В общем случае оно не поддаётся "итеративной регуляризации". Скобки могут быть вложенными, сочетаться по "или" и т.п. Т.е. есть произвольное регулярное выражение. Нужно для произвольной строки (если она ему соответствует) получить (почти) все backreference-ы. На PL/SQL-е. |
||
30 сен 08, 19:34 [6247735] Ответить | Цитировать Сообщить модератору |
Denis Popov Member Откуда: Санкт-Петербург Сообщений: 7855 |
Так может быть если
то так и придется поступать, т.е. менять регулярное выражение: оборачивать первые 9 в скобки, вырезать их как одно \1 и читать дальше? |
||||
30 сен 08, 20:32 [6247867] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: 1984. Выбраковка финно-угром началась. КЯЗ Сообщений: 27846 |
Так в общем случае, не нарушив смысл выражения, это невозможно. Пример, когда скобки нельзя опустить: select 'Matched' as status from dual where regexp_like ( '123rd', '^\d+(st|nd|rd|th|)' ); STATUS ------- Matched |
||
1 окт 08, 11:02 [6249195] Ответить | Цитировать Сообщить модератору |
Все форумы / Oracle | ![]() |