powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Регулярные выражения: как получить ВСЕ вхождения шаблона?
11 сообщений из 11, страница 1 из 1
Регулярные выражения: как получить ВСЕ вхождения шаблона?
    #39699606
Collins
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Имеется строка, состоящая из двух частей: сначала N букв, потом M цифр. Пример такой строки:
Код: plsql
1.
DECLARE str varchar2(1000) := 'abcdefghijklmnopqrstuvwxyz1234567890';



Нужно получить ВСЕ вхождения трёх цифр подряд.

Если делать так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE
  str          varchar2(1000) := 'abcdefghijklmnopqrstuvwxyz1234567890';
  strSubstring varchar2(10);
  cnt          number := 1;

BEGIN

  LOOP
    strSubstring := REGEXP_SUBSTR(str, '\d\d\d', 1, cnt);
    DBMS_OUTPUT.PUT_LINE(strSubstring);
    cnt := cnt + 1;
  EXIT WHEN strSubstring IS NULL;
  END LOOP;

END;


то получаю только три вхождения:
Код: plsql
1.
2.
3.
123
456
789


Но ведь нашему шаблону удовлетворяют и другие сочетания цифр: 234, 345, 567, 678, 890. Посоветуйте, пож., как их "выцепить" ?
...
Рейтинг: 0 / 0
Регулярные выражения: как получить ВСЕ вхождения шаблона?
    #39699608
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Collinsкак их "выцепить" ?
Код: plsql
1.
regexp_instr
...
Рейтинг: 0 / 0
Регулярные выражения: как получить ВСЕ вхождения шаблона?
    #39699621
Collins
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicCollinsкак их "выцепить" ?
Код: plsql
1.
regexp_instr



Если использовать функцию REGEXP_INSTR и подставить её в код:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DECLARE
  str          varchar2(1000) := 'abcdefghijklmnopqrstuvwxyz1234567890';
  numPosition  number;
  cnt          number := 1;

BEGIN

  LOOP
    numPosition := REGEXP_INSTR(str, '\d\d\d', 1, cnt);
    EXIT WHEN numPosition = 0;

    DBMS_OUTPUT.PUT_LINE(numPosition);
    cnt := cnt + 1;  
  END LOOP;

END;



то мы получим только три номера позиций: 27 (соответствует сочетанию 123), 30 (для сочетания 456) и 33 (для сочетания 789).
А номера позиций 28, 29, 31, 32, 34 мы всё равно не получим.
...
Рейтинг: 0 / 0
Регулярные выражения: как получить ВСЕ вхождения шаблона?
    #39699623
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CollinsЕсли использовать функцию REGEXP_INSTR и подставить её в код:Надо же немножко и мозг включать.
...
Рейтинг: 0 / 0
Регулярные выражения: как получить ВСЕ вхождения шаблона?
    #39699652
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Collins,
...
str:=substr(str,REGEXP_INSTR(str, '\d\d\d', 1, 1)+1);
...
.....
stax
...
Рейтинг: 0 / 0
Регулярные выражения: как получить ВСЕ вхождения шаблона?
    #39699666
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лови:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
declare
    v_str varchar2(1000) := 'abcdefghijklmnopqrstuvwxyz1234567890';
    v_pos number := 0;
begin
  loop
    v_pos := regexp_instr(v_str,'\d{3}',v_pos + 1);
    exit when v_pos = 0;
    dbms_output.put_line('Position: ' || v_pos || ' Value: ' || substr(v_str,v_pos,3));
  end loop;
end;
/
Position: 27 Value: 123
Position: 28 Value: 234
Position: 29 Value: 345
Position: 30 Value: 456
Position: 31 Value: 567
Position: 32 Value: 678
Position: 33 Value: 789
Position: 34 Value: 890

PL/SQL procedure successfully completed.

SQL> 



SY.
...
Рейтинг: 0 / 0
Регулярные выражения: как получить ВСЕ вхождения шаблона?
    #39699671
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без регулярки:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
declare
    v_str varchar2(1000) := 'abcdefghijklmnopqrstuvwxyz1234567890';
    v_pos number := 0;
    v_strx varchar2(1000) := translate(v_str,'123456789','000000000');
begin
  loop
    v_pos := instr(v_strx,'000',v_pos + 1);
    exit when v_pos = 0;
    dbms_output.put_line('Position: ' || v_pos || ' Value: ' || substr(v_str,v_pos,3));
  end loop;
end;
/
Position: 27 Value: 123
Position: 28 Value: 234
Position: 29 Value: 345
Position: 30 Value: 456
Position: 31 Value: 567
Position: 32 Value: 678
Position: 33 Value: 789
Position: 34 Value: 890

PL/SQL procedure successfully completed.

SQL> 



SY.
...
Рейтинг: 0 / 0
Регулярные выражения: как получить ВСЕ вхождения шаблона?
    #39699697
Collins
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,
Спасибо!
...
Рейтинг: 0 / 0
Регулярные выражения: как получить ВСЕ вхождения шаблона?
    #39699850
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicCollinsкак их "выцепить" ?
Код: plsql
1.
regexp_instr


Казалось бы, личная жизнь удалась, но не выдюжил - тут же

ElicНадо же немножко и мозг включать.

Elic - ты старпёр с рождения видимо ))

PS: я редко захожу, а тут снова "он", великий, беспощадный, и ... ему все равно по на чьё-то мнение, форум - его жизнь!
не лишайте его форума, заболеет.
...
Рейтинг: 0 / 0
Регулярные выражения: как получить ВСЕ вхождения шаблона?
    #39699856
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogelа тут снова "он", великий, беспощадный, и ... ему все равно по на чьё-то мнение, форум - его жизнь!
не лишайте его форума, заболеет.Ты уверен, что ты сам уже не болен?
...
Рейтинг: 0 / 0
Регулярные выражения: как получить ВСЕ вхождения шаблона?
    #39699879
andrey odegov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select
  digpos
from (
  select
    digpos,
    regexp_instr('abcd1efg12hijk345lmnop6789qrstuvwxyz1234567890', '\d\d\d', digpos) rxpos
  from (
    select
      regexp_instr('abcd1efg12hijk345lmnop6789qrstuvwxyz1234567890', '\d', 1, level) digpos
    from dual
    connect by level <= regexp_count('abcd1efg12hijk345lmnop6789qrstuvwxyz1234567890', '\d')
  )
)
where digpos = rxpos

DIGPOS1523243738394041424344
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Регулярные выражения: как получить ВСЕ вхождения шаблона?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]