На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ALXR
  
    > Шаблон RegExp_Replace , Шаблон RegExp_Replace
      Здравствуйте! Подскажите, пожалуйста, как правильно составить шаблон для регулярного выражения в PL SQL Developer.
      Есть поле, в котором содержится информация о номерах договоров и датами их заключения. В номерах договоров могут быть и пробелы, и буквы с цифрами, и тире и скобки и слешы, в общем - все знаки пукнутации

      К примеру, поле '1234 от 19.10.2016, 23456 от 08.01.2017'.

      Если написать шаблон так, то всё верно работает:

      select
      RegExp_Replace('1234 от 19.10.2016, 23456 от 08.01.2017',
      '([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}\.[[:digit:]]{2}\.[[:digit:]]{2,4})',
      '\1') S1, -- Номер договора
      RegExp_Replace('1234 от 19.10.2016, 23456 от 08.01.2017',
      '([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}\.[[:digit:]]{2}\.[[:digit:]]{2,4})',
      '\2') as S2,
      RegExp_Replace('1234 от 19.10.2016, 23456 от 08.01.2017',
      '([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}\.[[:digit:]]{2}\.[[:digit:]]{2,4})',
      '\3') as S3 -- Дата договора
      from dual;

      Результат:
      S1 = 1234, 23456
      S2 = от , от
      S3 = 19.10.2016, 08.01.2017

      Но дело в том, что может быть через запятую несколько договоров и дат, например 'Rc13353, Gt53381, Uy53384 от 08.01.2017, Gtu3382 и Gkhd880 от 10.01.2017',
      или номера договоров указаны через пробел, например ''
      И тогда уже этот шаблон не работает, так как есть пробелы:
      select
      RegExp_Replace('Rc13353, Gt53381, Uy53384 от 08.01.2017, Gtu3382 и Gkhd880 от 10.01.2017',
      '([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}\.[[:digit:]]{2}\.[[:digit:]]{2,4})',
      '\1') S1, -- Номер договора
      RegExp_Replace('Rc13353, Gt53381, Uy53384 от 08.01.2017, Gtu3382 и Gkhd880 от 10.01.2017',
      '([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}\.[[:digit:]]{2}\.[[:digit:]]{2,4})',
      '\2') as S2,
      RegExp_Replace('Rc13353, Gt53381, Uy53384 от 08.01.2017, Gtu3382 и Gkhd880 от 10.01.2017',
      '([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}\.[[:digit:]]{2}\.[[:digit:]]{2,4})',
      '\3') as S3 -- Дата договора
      from dual;

      Результат:
      S1 = Rc13353, Gt53381, Uy53384, Gtu3382 и Gkhd880
      S2 = Rc13353, Gt53381, от , Gtu3382 и от
      S3 = Rc13353, Gt53381, 08.01.2017, Gtu3382 и 10.01.2017


      select
      RegExp_Replace('O(d) L123 от 08.01.2017',
      '([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}\.[[:digit:]]{2}\.[[:digit:]]{2,4})',
      '\1') S1, -- Номер договора
      RegExp_Replace('O(d) L123 от 08.01.2017',
      '([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}\.[[:digit:]]{2}\.[[:digit:]]{2,4})',
      '\2') as S2,
      RegExp_Replace('O(d) L123 от 08.01.2017',
      '([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}\.[[:digit:]]{2}\.[[:digit:]]{2,4})',
      '\3') as S3 -- Дата договора
      from dual;

      Результат:
      S1 = O(d) L123
      S2 = O(d) от
      S3 = O(d) 08.01.2017

      Если в шаблон в первую часть добавить пробел, то он распознает почему-то только последнюю дату, если их две указано, не распознает по шаблону дату в середине строки:

      Шаблон = '([[:alnum:][:punct:][:space:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}\.[[:digit:]]{2}\.[[:digit:]]{2,4})'

      Результаты:
      1. '1234 от 19.10.2016, 23456 от 08.01.2017'
      S1 = 1234 от 19.10.2016, 23456
      S2 = от
      S3 = 08.01.2017
      2. 'Rc13353, Gt53381, Uy53384 от 08.01.2017, Gtu3382 и Gkhd880 от 10.01.2017'
      S1 = Rc13353, Gt53381, Uy53384 от 08.01.2017, Gtu3382 и Gkhd880
      S2 = от
      S3 = 10.01.2017
      3. 'O(d) L123 от 08.01.2017'
      S1 = O(d) L123
      S2 = от
      S3 = 08.01.2017

      Помогите, пожалуйста, правильно написать правильный шаблон, чтобы всё примеры корректно парсил
      Сообщение отредактировано: him_himbeere -
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0163 ]   [ 15 queries used ]   [ Generated: 19.03.24, 05:24 GMT ]