Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Регулярные выражения в PL/SQL


Автор: corpsehunter 28.12.2007, 21:48
Как проверить строчку с помощью регулярный выражений в pl/sql? 
Вооще, надо проверить мыло на корректность, но, главное, расскажите как с ними (регулярными выражениями) работать, а само выражение я и сам запросто составлю...

p.s. Ничего не нашел - нашел только в оглавлении одной книжки, а саму книжку ни где найти не могу....

Автор: skyboy 28.12.2007, 22:19
Цитата(corpsehunter @  28.12.2007,  20:48 Найти цитируемый пост)
расскажите как с ними (регулярными выражениями) работать

саму концепцию регулярных выражений и общепринятый синтаксис можно посмотреть в http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F
если ты о том, какие функции можно в pl/sql использовать для поиска по регулярным выражениям, так есть http://download-west.oracle.com/docs/cd/B13789_01/server.101/b10759/conditions018.htm(и http://download-uk.oracle.com/docs/cd/B14117_01/appdev.101/b10807/g_faq.htm#sthref1977)

Добавлено через 1 минуту и 31 секунду
Цитата(corpsehunter @  28.12.2007,  20:48 Найти цитируемый пост)
Ничего не нашел 

запрос: "http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B+%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85+%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9"
результат: 647 тысяч страниц.

Автор: corpsehunter 29.12.2007, 00:49
Цитата(skyboy @ 28.12.2007,  22:19)

запрос: "http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B+%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85+%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9"
результат: 647 тысяч страниц.

Вот эта вот фраза:
Цитата(corpsehunter @ 28.12.2007,  21:48)
а само выражение я и сам запросто составлю...

обозначала, что с регулярными выражениями я встречался неоднократно, а искал я именно как ими пользвоаться в PL/SQL. Так что не надо язвить  :PPP

И забыл добавить самое главное - у меня Oracle 9i, правда я и сам уже нашел, что они появились только начиная с 10g...

Автор: skyboy 29.12.2007, 09:08
Цитата(corpsehunter @  28.12.2007,  23:49 Найти цитируемый пост)
И забыл добавить самое главное - у меня Oracle 9i

да, это важно.
Цитата(corpsehunter @  28.12.2007,  23:49 Найти цитируемый пост)
правда я и сам уже нашел, что они появились только начиная с 10g... 

с Oracle практически незнаком, потому имею смелость сделать предположение: если очень надо и в oracle http://en.wikipedia.org/wiki/User_Defined_Function может быть не только на PL/SQL, то можно либо засунуть работу с регулярным выражениями в DLL, либо http://forum.vingrad.ru/forum/topic-185331/kw-regexp-%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B5-%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-udf.html в MSSQL сделать работу с регулярными выражениями через ActiveX. Конечно, если Oracle такое поддерживает и задержки на вызов внешних по отношению к СУБД потоков не перевешивают получаемого функционала.

Автор: skyboy 29.12.2007, 10:13
Цитата(corpsehunter @  28.12.2007,  20:48 Найти цитируемый пост)
Вооще, надо проверить мыло на корректность

я сразу как-то не заметил постановку задачи. а почему не проверять валидность адреса на стороне клиента БД(РНР там или ASP.NET - на чем делаешь)?

Автор: LSD 29.12.2007, 12:30

M
LSD
Перенесено из баз данных


Добавлено через 3 минуты и 11 секунд
Цитата(corpsehunter @  29.12.2007,  00:49 Найти цитируемый пост)
И забыл добавить самое главное - у меня Oracle 9i, правда я и сам уже нашел, что они появились только начиная с 10g...

Можно написать хранимую процедуру на Java.

Автор: corpsehunter 29.12.2007, 21:49
Цитата(skyboy @  29.12.2007,  10:13 Найти цитируемый пост)
я сразу как-то не заметил постановку задачи. а почему не проверять валидность адреса на стороне клиента БД(РНР там или ASP.NET - на чем делаешь)?

Да не, все куда проще - это для лабы надо и надо именно на Оракл, по этому просто поставил 10g и проблем нету=))))

Автор: Nuzur 29.1.2008, 18:08


corpsehunter, 

А чем тебе такой вариант не угодил?

Код

DECLARE
       my_var VARCHAR(50);
BEGIN

     IF( 'my@my.ru' LIKE '_%@_%._%' )
     THEN
         DBMS_OUTPUT.put_line(' Correct! ' );
     ELSE
         DBMS_OUTPUT.put_line(' WRONG!!!! ' );
     END IF;
END;


my_var там лишний в него хотел запихнуть разные адреса для наглядности но потом линиво стало smile Так чем такой вариант проверки не устроит?

Автор: LSD 30.1.2008, 13:26
Цитата(Nuzur @  29.1.2008,  18:08 Найти цитируемый пост)
А чем тебе такой вариант не угодил?

Как он среагирует на 123@456.789?

Автор: Nuzur 31.1.2008, 17:44
LSD, ну знаеш, тоелепатический контакт у PL/SQL еще не видел. Так что он и на идиns@на.йух Нормально отреагирует, но суть в том что регулярность выражения аппрувлена, а про числа ты никак не словишь, ведь в названиях сайиа либо мейла запросто могут быть... так шо "не биллинговая проблема" smile
Но замечание принято.

Автор: corpsehunter 3.2.2008, 23:48
Такое решение я тоже рассматривал... Собственно говоря, цифры в названии ящика и домена возможны, не могут они быть только в имени домена верхнего уровня, т.е. ящик типа 123@456.com вполне может быть, так что числа и ловить не надо, кроме как там, где уже указано...

Автор: Nuzur 4.2.2008, 15:19
corpsehunter, Если найдете более красивое решение поделитесь пожалуйста. Я такую траблу на сях в свое время решал и ничего лучше не придумал. Правда я потом и не думал дальше то smile
ЗЫ простите за оффтоп.

Автор: alt5000 22.4.2010, 10:22
А как насчет split в regex'ах Оракла?

Автор: DimW 22.4.2010, 10:40
Цитата(alt5000 @  22.4.2010,  10:22 Найти цитируемый пост)
А как насчет split в regex'ах Оракла? 


а как насчет того, что тема обсуждалась два года назад и версия оракла 9i?

Автор: alt5000 22.4.2010, 10:53
Цитата(DimW @ 22.4.2010,  10:40)
а как насчет того, что тема обсуждалась два года назад и версия оракла 9i?

Я спросил, потому что интересует сплит (чтобы не начинать новые темы). Не подскажете, как в массив передать разделенные через сплит части строки?

Автор: DimW 22.4.2010, 11:27
Цитата(alt5000 @  22.4.2010,  10:53 Найти цитируемый пост)
Я спросил

 smile извини, я подумал это ответ - серьезно.

Автор: Zloxa 22.4.2010, 22:51
Цитата(corpsehunter @  29.12.2007,  00:49 Найти цитируемый пост)
 у меня Oracle 9i

http://download.oracle.com/docs/cd/A97335_02/apps.102/a90101/pspatt.htm
Цитата(alt5000 @  22.4.2010,  10:53 Найти цитируемый пост)
 в массив передать разделенные через сплит части строки

Можно сделать sql+регекспами, офигенски круто, лаконично - в одно выражение
А можно просто по пацански instr-ами, тупо, не интересно, но трошки-трошки шустрее...в пиццот раз лишто
Код

declare
  type varchar_table is table of varchar2(200);
  foo varchar_table;
  src varchar2(4000);
  start_time number;
 
  function regexp_split(src varchar2)
    return varchar_table
  is
    result varchar_table;
  begin
    select rtrim(regexp_substr(str,'[^,]+,?',1,level),',')
      bulk collect into result
      from (select src str from dual)
      connect by regexp_substr(str,'[^,]+,?',1,level) is not null;
    return result;
  end;
  function instr_split(src varchar2)
    return varchar_table
  is
    result varchar_table := varchar_table();
    cur_pos number := 1;
    next_pos number;
    len number := nvl(length(src),0);
  begin
    while cur_pos <= len loop
      next_pos := instr(src||',',',',cur_pos);
      result.extend(1);
      result(result.count):= substr(src,cur_pos,next_pos - cur_pos);
      cur_pos := next_pos + 1;
    end loop;
    return result;
  end;
begin
  src := '1';
  for i in 1..100
  loop
    src := src||','||sys_guid;
  end loop;
  start_time := dbms_utility.get_time;
  for i in 1..500
  loop
    foo := regexp_split(src);
  end loop;
  dbms_output.put_line('sql+regexp:'||(dbms_utility.get_time-start_time));
  start_time := dbms_utility.get_time;
  for i in 1..500
  loop
    foo := instr_split(src);
  end loop;
  dbms_output.put_line('pl/sql+instr:'||(dbms_utility.get_time-start_time));
end;
/
 
sql+regexp:4971
pl/sql+instr:10
 
PL/SQL procedure successfully completed


Цитата(DimW @  22.4.2010,  10:40 Найти цитируемый пост)
а как насчет того, что тема обсуждалась два года назад

на то - пофиг, когда интересно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)