powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Паттерн для регулярки
22 сообщений из 22, страница 1 из 1
Паттерн для регулярки
    #39254431
l-freeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, знатоки

Помогите плз с патерном для регулярки, обработка строки типа:

12 0 01\01\2004 31\12\2054 ОСНОВНА ПЕНСIЯ З ОБМЕЖЕННЯМ ВИПЛАТИ 0 0.00 0 0 1
21 0 16\09\2008 31\12\2054 МIН.РОЗМIР ПЕНСIп (ШАХТ.-80% ЗАРПЛАТИ) 0 0.00 0 0 1
111 3 01\01\2008 31\12\2011 ДОД. ПЕHСIЯ IHВ. 1 ГР. ВНАСЛ. ЧК (СТ.49) 14 30.00 1 1 1
112 1 01\07\2012 31\12\2054 ДОД. ПЕHСIЯ IHВ. 2 ГР. ВНАСЛ. ЧК ПОТЕРПIЛI (СТ.49 14 24.00 0 1 1

пошел следующим путем:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    date_patern := '((\d){1,2}[[:space:]]*.[[:space:]]*(\d){1,2}[[:space:]]*.[[:space:]]*(\d){1,4})';
    number_patern := '((\d)+)';
    space_patern := '[[:space:]]*';
    string_patern := '(\w|\d|[[:space:]])+'; ----????????????????
    
    str := regexp_substr(p_dic_content, number_patern||space_patern
                                     ||number_patern||space_patern
                                     ||date_patern||space_patern
                                     ||date_patern||space_patern
                                     );



но на тексте запоролся
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254462
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l-freemanно на тексте запоролся
Код: plsql
1.
'.+'

плюс якоря с самых краёв.
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254466
l-freeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
парсинг по следующему примеру:
12 0 01\01\2004 31\12\2054 ОСНОВНА ПЕНСIЯ З ОБМЕЖЕННЯМ ВИПЛАТИ 0 0.00 0 0 1

цветом выделил значения которые нужно получить со строки (так вроде наглядней)
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254469
l-freeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

с якорями не получится, строка заканчивается символом chr(13), плюс мне нужно получить значения, которые выделил цветом через подвыражения
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254470
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SQL> select * from dual where regexp_like('с якорями не получится, строка заканчивается символом'||chr(13), '\s+$');

D
-
X

1 row selected.


l-freemanмне нужно получить значения, которые выделил цветом через подвыраженияВ чём проблемы?
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254520
l-freeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,
моя строка имеет вид:
Код: plsql
1.
2.
3.
4.
str :=  '12 0 01\01\2004 31\12\2054 ОСНОВНА ПЕНСIЯ З ОБМЕЖЕННЯМ ВИПЛАТИ 0 0.00 0 0 1
           21 0 16\09\2008 31\12\2054 МIН.РОЗМIР ПЕНСIп (ШАХТ.-80% ЗАРПЛАТИ) 0 0.00 0 0 1
           111 3 01\01\2008 31\12\2011 ДОД. ПЕHСIЯ IHВ. 1 ГР. ВНАСЛ. ЧК (СТ.49) 14 30.00 1 1 1
           112 1 01\07\2012 31\12\2054 ДОД. ПЕHСIЯ IHВ. 2 ГР. ВНАСЛ. ЧК ПОТЕРПIЛI (СТ.49 14 24.00 0 1 1';




если я заякорю на конец строки (на '$'), плюс те патерны которые недокодил, то получу вот это выражение

112 1 01\07\2012 31\12\2054 ДОД. ПЕHСIЯ IHВ. 2 ГР. ВНАСЛ. ЧК ПОТЕРПIЛI (СТ.49 14 24.00 0 1 1

моя задача состоит в следующем:
необходимо все значения с первого абзаца(или строки до первого chr(13)):
{12} {0} {01\01\2004} {31\12\2054} {ОСНОВНА ПЕНСIЯ З ОБМЕЖЕННЯМ ВИПЛАТИ} {0} {0.00} {0} {0} {1}
распихнуть в переменные и заинсертить в таблицу, затем перейти ко второму абзацу(второе вхождение chr(13)):
{21} {0} {16\09\2008} {31\12\2054} {МIН.РОЗМIР ПЕНСIп (ШАХТ.-80% ЗАРПЛАТИ)} {0} {0.00} {0} {0} {1}
и сделать то же самое. В переменные хотел распихать через subexpression => 1(затем 2,3...). Опять же без патерна для текста - сделать этого не получится

хотел сделать это через регулярку, циклом на параметр occurrence (если будет долго работать, то пройтись по строке и разбить на подстроки по chr(13));

проблема в том, что я не могу выбрать текст со строки, т.е. "ОСНОВНА ПЕНСIЯ З ОБМЕЖЕННЯМ ВИПЛАТИ" до первого chr(13);
"МIН.РОЗМIР ПЕНСIп (ШАХТ.-80% ЗАРПЛАТИ)" до второго chr(13) и т.д


вот потому и прошу помочь матерого регулярщика с патерном на текст(при том что в тексте есть как цифры, так и не буквенные символы)
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254536
l-freeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,
хочу что то по типу такого:
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
DECLARE
str_begin VARCHAR2(32767);
str VARCHAR2(32767);
char_sh VARCHAR2(1) := chr(10);
p_pos NUMBER;
p_prev_pos NUMBER;
len_str NUMBER;
date_patern VARCHAR2(500) := '((\d){1,2}[[:space:]]*.[[:space:]]*(\d){1,2}[[:space:]]*.[[:space:]]*(\d){1,4})';
number_patern VARCHAR2(500) := '(\d+)';
space_patern VARCHAR2(500) := '[[:space:]]*';
string_patern VARCHAR2(500) := '(.+\s+)';
money_pattern VARCHAR2(500) := '((\d){1,10}.(\d){1,2})';
full_patern VARCHAR2(3000);
p_out VARCHAR2(50);

BEGIN

  str_begin := q'[fdsfdsfds------05864
  gfdgdf,;l,----dgfdgf-0342-94329
  12 0 01\01\2004 31\12\2054 ОСНОВНА ПЕНСIЯ З ОБМЕЖЕННЯМ ВИПЛАТИ 0 0.00 0 0 1
  21 0 16\09\2008 31\12\2054 МIН.РОЗМIР ПЕНСIп (ШАХТ.-80% ЗАРПЛАТИ) 0 0.00 0 0 1
  111 3 01\01\2008 31\12\2011 ДОД. ПЕHСIЯ IHВ. 1 ГР. ВНАСЛ. ЧК (СТ.49) 14 30.00 1 1 1
  112 1 01\07\2012 31\12\2054 ДОД. ПЕHСIЯ IHВ. 2 ГР. ВНАСЛ. ЧК ПОТЕРПIЛI (СТ.49 14 24.00 0 1 1]';
  
   full_patern := number_patern||space_patern||
                                 number_patern||space_patern||
                                 date_patern||space_patern||
                                 date_patern||space_patern||
                                 string_patern||space_patern||
                                 number_patern||space_patern||
                                 money_pattern||space_patern||
                                 number_patern||space_patern||
                                 number_patern||space_patern||
                                 number_patern||space_patern;
  
  p_prev_pos := instr(str_begin,char_sh,1);
  len_str := length(str_begin);
  
  loop
    exit when p_pos = len_str;
    p_pos := instr(str_begin,char_sh,p_prev_pos);
      IF p_pos = 0
        THEN p_pos := len_str;
      END IF;
    
    str := trim(substr(str_begin,p_prev_pos,p_pos-p_prev_pos));
      IF LENGTH(str) > 0 THEN
            IF REGEXP_LIKE(str, full_patern)
               THEN 
                    FOR i IN 1..10 loop
                          p_out := regexp_substr(str,full_patern,subexpression => i);
                          dbms_output.put_line(p_out);
                    END LOOP;
            END IF;
      END IF;
    
    p_prev_pos := p_pos+1;
  END LOOP;
  
  
END;



вот только подвыражения кривые получаются...
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254537
l-freeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
опечатался, до цикла
Код: plsql
1.
p_prev_pos :=1; 
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254570
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l-freemanто пройтись по строке и разбить на подстроки по chr(13));Когда ни хера не понимаешь, лучше именно декомпозировать задачу на более простейшие.
Вот если и простейшая задача не выйдет, тогда и спрашивай лаконично, без соплей и тонн говнокода.
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254582
l-freeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Что именно говняное в коде?
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254585
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l-freemanЧто именно говняное в коде?Ты не можешь сжато изложить свою проблему? И вместо этого хочешь поспорить о говнокодистости? - Оно тебе надо?
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254592
l-freeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

не в коем случае не хочу поспорить, хочу научится не писать говнокода больше
просто не понимаю в чем именно наговнил


не знаю как получить со стоки, к примеру:

{12} {0} {01\01\2004} {31\12\2054} {ОСНОВНА ПЕНСIЯ З ОБМЕЖЕННЯМ ВИПЛАТИ} {0} {0.00} {0} {0} {1}

подвыражения, которые мною выделенные скобками, затем то же самое получить со строки:

{21} {0} {16\09\2008} {31\12\2054} {МIН.РОЗМIР ПЕНСIп (ШАХТ.-80% ЗАРПЛАТИ)} {0} {12.05} {0} {0} {1}

и так далее для тысяч различных строк
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254595
проходил мимо...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l-freeman,

В этот раз у Elic' а просто ангельское терпение. Да и ты, вроде, в бутылку не лезешь. Повторю, пожалуй, основные мысли, может поможет:
- распарси сначала только одну строку
- паттерн начни с ^, закончи $. этим ты привяжешь первые поля к началу, а последние - к концу строки.
- всё остально (текст в твоей интерпретации) - .+
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254618
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l-freemanпарсинг по следующему примеру:
12 0 01\01\2004 31\12\2054 ОСНОВНА ПЕНСIЯ З ОБМЕЖЕННЯМ ВИПЛАТИ 0 0.00 0 0 1

цветом выделил значения которые нужно получить со строки (так вроде наглядней)Регулярки не стоит усложнять без надобности.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with t as
 (select '12 0 01\01\2004 31\12\2054 ОСНОВНА ПЕНСIЯ З ОБМЕЖЕННЯМ ВИПЛАТИ 0 0.00 0 0 1' str,
         '\d+ (\d+) \S+ (\S+).+(\d+) [0-9.]+ (\d+) \d+ (\d+)' pattern
    from dual)
select regexp_substr(str, pattern, 1, 1, null, 1) s1,
       regexp_substr(str, pattern, 1, 1, null, 2) s2,
       regexp_substr(str, pattern, 1, 1, null, 3) s3,
       regexp_substr(str, pattern, 1, 1, null, 4) s4,
       regexp_substr(str, pattern, 1, 1, null, 5) s5,
       regexp_replace(str, pattern, '\1 \2 \3 \4 \5') all_together
  from t;

S S2         S S S ALL_TOGETHER
- ---------- - - - ------------------
0 31\12\2054 0 0 1 0 31\12\2054 0 0 1
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254626
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopl-freemanпарсинг по следующему примеру:
12 0 01\01\2004 31\12\2054 ОСНОВНА ПЕНСIЯ З ОБМЕЖЕННЯМ ВИПЛАТИ 0 0.00 0 0 1

цветом выделил значения которые нужно получить со строки (так вроде наглядней) Регулярки не стоит усложнять без надобности.


А ты уверен ему нужно то что синим? Он раскрасил всё, и заявил что нужные значения выделены цветом - по eго мнению так наглядней .

SY.
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254635
l-freeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

спасибо огромное, патерны более элегантны, но вот только вопрос, почему для 10 подвыражения значение - null?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with t as
 (SELECT '12 0 01\01\2004 31\12\2054 ОСНОВНА ПЕНСIЯ З ОБМЕЖЕННЯМ ВИПЛАТИ 0 0.00 0 0 1' str,
         '(\d+)\s+(\d+)\s+(\S+)\s+(\S+)\s+(.+)\s+(\d+)\s+([0-9.]+)\s+(\d+)\s+(\d+)\s+(\d+)' pattern
    from dual)
select regexp_substr(str, pattern, 1, 1, null, 1) s1,
       regexp_substr(str, pattern, 1, 1, null, 2) s2,
       regexp_substr(str, pattern, 1, 1, null, 3) s3,
       regexp_substr(str, pattern, 1, 1, null, 4) s4,
       regexp_substr(str, pattern, 1, 1, null, 5) s5,
       regexp_substr(str, pattern, 1, 1, null, 6) s6,
       regexp_substr(str, pattern, 1, 1, null, 7) s7,
       regexp_substr(str, pattern, 1, 1, null, 8) s8,
       regexp_substr(str, pattern, 1, 1, null, 9) s9,
       regexp_substr(str, pattern, 1, 1, null, 10) s10
  from t;
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254639
l-freeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254643
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l-freemanпочему для 10 подвыражения значение - null?"Я считаю до пятидевяти, не могу до десяти!" :)
10.2: regexp_replace и 10-ый backreference
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254644
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l-freemanспасибо огромное, патерны более элегантны, но вот только вопрос, почему для 10 подвыражения значение - null?Перед тем как спросить на форуме всегда имеет смысл сначала заглянуть в доку.
http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions150.htm For a pattern with subexpressions, subexpr is a nonnegative integer from 0 to 9 indicating which subexpression in pattern is to be returned by the function.
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254645
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
l-freemandbms_photoshop,

спасибо огромное, патерны более элегантны, но вот только вопрос, почему для 10 подвыражения значение - null?


Потому-как решeние нерабочее. Параметр subexpr в regexp_substr это не что иное как backreference, а их всего 10 (0 - 9):

For a pattern with subexpressions, subexpr is a nonnegative integer from 0 to 9 indicating which subexpression in pattern is to be returned by the function. This parameter has the same semantics that it has for the REGEXP_INSTR function. Refer to REGEXP_INSTR for more information.

SY.
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254657
Фотография 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
SQL> select  rownum,
  2          str
  3    from  tbl
  4  /

    ROWNUM STR
---------- ---------------------------------------------------------------------------------------------
         1 12 0 01\01\2004 31\12\2054 ОСНОВНА ПЕНСIЯ З ОБМЕЖЕННЯМ ВИПЛАТИ 0 0.00 0 0 1
           21 0 16\09\2008 31\12\2054 МIН.РОЗМIР ПЕНСIп (ШАХТ.-80% ЗАРПЛАТИ) 0 0.00 0 0 1
           111 3 01\01\2008 31\12\2011 ДОД. ПЕHСIЯ IHВ. 1 ГР. ВНАСЛ. ЧК (СТ.49) 14 30.00 1 1 1
           112 1 01\07\2012 31\12\2054 ДОД. ПЕHСIЯ IHВ. 2 ГР. ВНАСЛ. ЧК ПОТЕРПIЛI (СТ.49 14 24.00 0 1 1

SQL>
with t as (
           select  regexp_substr(str,'^.+$',1,level,'m') line
             from  tbl
             connect by rowid = prior rowid
                 and prior sys_guid() is not null
                 and level <= regexp_count(str,'^.+$',1,'m')
          )
select regexp_substr(line,'[^ ]+',1,1) s1,
       regexp_substr(line,'[^ ]+',1,2) s2,
       regexp_substr(line,'[^ ]+',1,3) s3,
       regexp_substr(line,'[^ ]+',1,4) s4,
       regexp_replace(line,'([^ ]+ ){4}(.*)( [^ ]+){5}$','\2') s5,
       regexp_replace(line,'([^ ]+ ){4}.*([^ ]+)( [^ ]+){4}$','\2') s6,
       regexp_replace(line,'([^ ]+ ){4}.*([^ ]+)( [^ ]+){3}$','\2') s7,
       regexp_replace(line,'([^ ]+ ){4}.*([^ ]+)( [^ ]+){2}$','\2') s8,
       regexp_replace(line,'([^ ]+ ){4}.*([^ ]+)( [^ ]+)$','\2') s9,
       regexp_substr(line, '(\d+)$') s10
  from t
/

S1  S2 S3         S4         S5                                                      S6 S7   S8 S9 S10
--- -- ---------- ---------- ------------------------------------------------------- -- ---- -- -- ---
12  0  01\01\2004 31\12\2054 ОСНОВНА ПЕНСIЯ З ОБМЕЖЕННЯМ ВИПЛАТИ                     0  0    0  0  1
21  0  16\09\2008 31\12\2054 МIН.РОЗМIР ПЕНСIп (ШАХТ.-80% ЗАРПЛАТИ)                  0  0    0  0  1
111 3  01\01\2008 31\12\2011 ДОД. ПЕHСIЯ IHВ. 1 ГР. ВНАСЛ. ЧК (СТ.49)                4  0    1  1  1
112 1  01\07\2012 31\12\2054 ДОД. ПЕHСIЯ IHВ. 2 ГР. ВНАСЛ. ЧК ПОТЕРПIЛI (СТ.49       4  0    0  1  1

SQL> 



SY.
...
Рейтинг: 0 / 0
Паттерн для регулярки
    #39254670
l-freeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо

остановлюсь на:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t as
 (SELECT '12 0 01\01\2004 31\12\2054 ОСНОВНА ПЕНСIЯ З ОБМЕЖЕННЯМ ВИПЛАТИ 0 0.00 0 0 3' str,
         '(\d+)\s+(\d+)\s+(\S+)\s+(\S+)\s+(.+)\s+(\d+)\s+([0-9.]+)\s+(\d+)\s+(\d+)\s+(\d+)' pattern
         ,'(.+)\s+(\d+)' pattern2
    from dual)
select regexp_substr(str, pattern, 1, 1, null, 1) s1,
       regexp_substr(str, pattern, 1, 1, null, 2) s2,
       regexp_substr(str, pattern, 1, 1, null, 3) s3,
       regexp_substr(str, pattern, 1, 1, null, 4) s4,
       regexp_substr(str, pattern, 1, 1, NULL, 5) s5,
       regexp_substr(str, pattern, 1, 1, null, 6) s6,
       regexp_substr(str, pattern, 1, 1, null, 7) s7,
       regexp_substr(str, pattern, 1, 1, null, 8) s8,
       regexp_substr(str, pattern, 1, 1, NULL, 9) s9,
       regexp_replace(str, pattern2, '\2') s10
  from t;
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Паттерн для регулярки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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