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

Простая задача. Есть строка с разделителями. Необходимо написать регулярное выражение плана REGEXP_SUBSTR, которое извлекало бы нужный элемент.

Пример строки: 'A1;A2;;A4' .
Третий элемент, в данном случае, отсутствует, т.е. NULL.

Спасибо всем кто откликнется.
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39710982
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaXieДоброго времени суток всем!

Простая задача. Есть строка с разделителями. Необходимо написать регулярное выражение плана REGEXP_SUBSTR, которое извлекало бы нужный элемент.

Пример строки: 'A1;A2;;A4' .
Третий элемент, в данном случае, отсутствует, т.е. NULL.

Спасибо всем кто откликнется.


Студентам, желающим помощи

http://www.bugtraq.ru/forum/faq/general/smart-questions.html] Как правильно задавать вопросы
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39710990
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaXie,

Вроде'ж не первый год замужем на форуме, а задавать вопросы так и не научился

Посмотри тему 21688294 , там задача аналогична Вашей
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711026
MaXie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторПосмотри тему 21688294, там задача аналогична Вашей

Вы под "аналогией" подразумеваете использование регулярного выражения REGEXP_SUBSTR?
В приведенной Вами ссылке, задача схожая, но другая. Если я правильно ее понял - извлечь нужный элемент строки, при условии что все элементы имеют длину хотя бы в один символ. В моем случае речь идет о строке с наличием "пустых" элементов.

Код: sql
1.
REGEXP_SUBSTR(строка, '[^;]+', 1, номер элемента)


- не подойдет, т.к. в приведенном мной примере, четвертый элемент окажется третьим.
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711033
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaXieавторПосмотри тему 21688294, там задача аналогична Вашей

Вы под "аналогией" подразумеваете использование регулярного выражения REGEXP_SUBSTR?
В приведенной Вами ссылке, задача схожая, но другая. Если я правильно ее понял - извлечь нужный элемент строки, при условии что все элементы имеют длину хотя бы в один символ. В моем случае речь идет о строке с наличием "пустых" элементов.

Код: sql
1.
REGEXP_SUBSTR(строка, '[^;]+', 1, номер элемента)


- не подойдет, т.к. в приведенном мной примере, четвертый элемент окажется третьим.

Не верю...
21691383
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711035
MaXie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторНе верю...
Не верите, что '+' в регулярных выражениях означает "один и более" символов?
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711057
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaXieавторНе верю...
Не верите, что '+' в регулярных выражениях означает "один и более" символов?

Не верю голословным утверждениям, и не вижу что Вы что-то сделали

не говоря о банальных instr/substr для которых данная задачка решается на раз/два
или о чтении документации

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with t(s) as (
select  'A1;A2;;A4' from dual
)
select level,rtrim(REGEXP_SUBSTR(';'||s||';','[^;]{0,100};',1,level+1),';') as info 
from t connect by level <=4;


     LEVEL INFO
---------- --------------------------------------------
         1 A1
         2 A2
         3
         4 A4
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711100
MaXie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Vadim Lejnin

Вопрос заключается в возможности решить эту задачу ограничившись только одним регулярным выражением.
Т.е. без TRIM'ов, REPLACE'ов и прочей "оберточной мишуры" - только инструкции регулярных выражений(одного выражения). Что задача решается на раз/два при помощи банальных substr и instr, понимание этого было изначально.

Примеры ( пробую найти 3-ий элемент ):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT REGEXP_SUBSTR('A1;A2;;A4', '[^;]+', 1, 3) FROM DUAL;
F
--
A4

SELECT REGEXP_SUBSTR('A1;A2;;A4', '[^;]*', 1, 3) AS F FROM DUAL;
F
--
A2


Во втором случае используется '*' - "ни одного или несколько символов", но он не дает ожидаемого результата.

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

наверное можна и проще, но маем шо маем
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  1  with t(s) as (
  2  select  'A1;A2;;A4;' from dual
  3  )
  4  select
  5   level
  6   ,regexp_substr(s,'(^|;)([^;]*)',1,level,null,2) sbs
  7* from t connect by level <= regexp_count(s,';') + 1
SQL> /

     LEVEL SBS
---------- ----------
         1 A1
         2 A2
         3
         4 A4
         5



.....
stax
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711180
MaXie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Stax

Ответ на мой вопрос(во всяком случае направление, в котором можно "копать")! Спасибо! )
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711190
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxнаверное можна и проще, но маем шо маем


Не то маем. Магия данных. Попробуй когда первый пустой:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with t(s) as (
              select  ';A2;A3;;A5;' from dual
             )
select  level,
        regexp_substr(s,'(^|;)([^;]*)',1,level,null,2) sbs
  from  t
  connect by level <= regexp_count(s,';') + 1
/

          LEVEL SBS
--------------- --------------------------------------------
              1
              2 A3
              3
              4 A5
              5
              6

6 rows selected.

SQL> 



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

матчить нужно со скобкой, а не то что до нее:
Код: plsql
1.
([^;]*);?
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711216
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так вроде работает (без ограничения на количество подгрупп )
Код: plsql
1.
2.
3.
4.
with t as ( select ';A1;A2;;A4;;;A7;;' x, level l from dual connect by level <=10)
SELECT x, REGEXP_substr(x, 
'(^;|;)([^;]*)',1,l,null,2) 
from t



Regards

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

Немного получше

Код: plsql
1.
2.
3.
4.
with t as ( select ';;;A1;A2;;A4;;;A7;;' x, level l from dual connect by level <=10)
SELECT x, REGEXP_substr(x, 
'(^;*|;)([^;]*)',1,l,null,2) 
from t
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711223
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфиловматчить нужно со скобкой, а не то что до нее:
Код: plsql
1.
([^;]*);?



А я то тут причем? Это stax'y. А по мне "Необходимо написать регулярное выражение плана REGEXP_SUBSTR, которое извлекало бы нужный элемент" либо от препода либо неправильная постановка. Правильная была бы извлечь что а не извлечь как.

SY.
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711472
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYStaxнаверное можна и проще, но маем шо маем

Не то маем. Магия данных. Попробуй когда первый пустой:
SY.

согласен, не учел

Ваш вариант?

....
stax
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711631
MaXie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем огромное спасибо за предложенные варианты решения!

авторА по мне "Необходимо написать регулярное выражение плана REGEXP_SUBSTR, которое извлекало бы нужный элемент" либо от препода либо неправильная постановка. Правильная была бы извлечь что а не извлечь как.

Задача.

Считать данные из файла(*.csv) в таблицу состоящую из 100 столбцов.

Код: sql
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_file          UTL_FILE.FILE_TYPE;
   v_file_rec      VARCHAR2(32000);
   v_sep_symb      CONSTANT CHAR(1 CHAR) := ';';
BEGIN
   ...
   v_file := UTL_FILE.FOPEN(
      location     => ..., 
      filename    => ..., 
      open_mode   => 'r'
   );
   ...
   UTL_FILE.GET_LINE(FILE => v_file, BUFFER => v_file_rec);
   ...
   INSERT INTO TBL_FILE
   SELECT
      ...
      REGEXP_SUBSTR(v_file_rec, '[^' || v_sep_symb || ']+', 1,   1)    AS C001,
      ...
      REGEXP_SUBSTR(v_file_rec, '[^' || v_sep_symb || ']+', 1, 100)    AS C100                                        
   FROM DUAL;
   ...
   COMMIT;
END;



Задача "классическая". Первое что приходит в голову использовать единое регулярное выражение для извлечения каждого из 100( может быть и меньше ) значений в строке. Такой подход, вроде, не противоречит логике. Оборачивать это в различные substr и instr, как это сперва предлагалось - про компактность и читаемость кода сразу можно забыть. Написать отдельную функцию - как вариант, но зачем.
Какие еще могут быть решения?

P.S. регулярное выражение в приведенном примере не корректно.
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711639
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaXieОборачивать это в различные substr и instr, как это сперва предлагалось - про компактность и читаемость кода сразу можно забыть. Написать отдельную функцию - как вариант, но зачем.Чтобы преобразовать строку в массив, например. И именно не регулярками.
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711671
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaXie,

Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711941
MaXie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторЧтобы преобразовать строку в массив, например. И именно не регулярками.
Вы полагаете что так будет быстрее?

авторNow they have two problems.
What is the second problem? )
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711954
MaXie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итого , используя идею высказанную Stax, решение изложенной задачи, если ограничиться только регулярным выражением, может быть следующим:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT 
    LEVEL AS NUM, 
    REGEXP_SUBSTR(';;A3;;;A6;;', '([^;]+|)(;?)', 1, LEVEL, NULL, 1) AS ITEM 
FROM DUAL
CONNECT BY LEVEL <= REGEXP_COUNT(';;A3;;;A6;;', ';') +1;

NUM ITEM
--- ----
1	
2	
3   A3
4	
5	
6   A6
7	
8	



Возможно, кому нибудь будет полезно при извлечении данных из csv-файлов.

Всем спасибо! )
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711958
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaXieавторЧтобы преобразовать строку в массив, например. И именно не регулярками.Вы полагаете что так будет быстрее?Я не полагаю, я знаю.
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711959
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaXieпри извлечении данных из csv-файлов.
Велосипедостроители, блин...
CSV берется лодырем или external table.
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39711975
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaXieСчитать данные из файла(*.csv) в таблицу состоящую из 100 столбцов.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select * from external (
  (name      varchar2(30),
   password  varchar2(30),
   uid_       number,
   gid       number,
   gecos     varchar2(100),
   directory varchar2(100),
   shell     varchar2(100) 
  ) type oracle_loader default directory server_tmp 
  access parameters (fields terminated by ':')
  location(server_etc:'passwd') 
);
...
Рейтинг: 0 / 0
Простая задача на регулярное выражение
    #39712158
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaXie,

в том что у вас теперь есть проблема и регулярное выражение.
Хоть бы почитали для начала как загружать CSV файлы
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Простая задача на регулярное выражение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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