Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 10.2: regexp_replace и 10-ый backreference  [new]
Elic
Member

Откуда: 1984. Следующие на оккупацию финно-угром
Сообщений: 23864
Собственно, нужен функционал разбора строки на компоненты регулярными выражениями, аналогичный:
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]     Ответить | Цитировать Сообщить модератору
 Re: 10.2: regexp_replace и 10-ый backreference  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7830

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]     Ответить | Цитировать Сообщить модератору
 Re: 10.2: regexp_replace и 10-ый backreference  [new]
Elic
Member

Откуда: 1984. Следующие на оккупацию финно-угром
Сообщений: 23864
Denis Popov
Пардон, что спровоцировал на "магию данных".
Это всего лишь пример регулярного выражения.
В общем случае оно не поддаётся "итеративной регуляризации". Скобки могут быть вложенными, сочетаться по "или" и т.п.

Т.е. есть произвольное регулярное выражение. Нужно для произвольной строки (если она ему соответствует) получить (почти) все backreference-ы. На PL/SQL-е.
30 сен 08, 19:34    [6247735]     Ответить | Цитировать Сообщить модератору
 Re: 10.2: regexp_replace и 10-ый backreference  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7830
Elic
Т.е. есть произвольное регулярное выражение. Нужно для произвольной строки (если она ему соответствует) получить (почти) все backreference-ы. На PL/SQL-е.

Так может быть если
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/ap_posix001.htm#i690819
\n - The backreference expression (n is a digit between 1 and 9)

то так и придется поступать, т.е. менять регулярное выражение: оборачивать первые 9 в скобки, вырезать их как одно \1 и читать дальше?
30 сен 08, 20:32    [6247867]     Ответить | Цитировать Сообщить модератору
 Re: 10.2: regexp_replace и 10-ый backreference  [new]
Elic
Member

Откуда: 1984. Следующие на оккупацию финно-угром
Сообщений: 23864
Denis Popov
т.е. менять регулярное выражение: оборачивать первые 9 в скобки, вырезать их как одно \1 и читать дальше?
Т.е. удалить из RE первые скобки без потери смысла выражения, чтобы уменьшить индекс искомого backreference-а?
Так в общем случае, не нарушив смысл выражения, это невозможно.
Пример, когда скобки нельзя опустить:
select 'Matched' as status from dual
  where regexp_like
     ( '123rd',
       '^\d+(st|nd|rd|th|)'
     );

STATUS
-------
Matched
1 окт 08, 11:02    [6249195]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить
 
Лучший учебный центр Microsoft!
Новейшие курсы Microsoft SQL Server 2014!
ОЧЕНЬ привлекательные цены на курсы Oracle — от 26 тыс.руб.!
Все курсы по базам данных: Microsoft SQL Server 2014, Oracle, IBM DB2, Access, MySql