Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[98.82.140.17] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте! Подскажите, пожалуйста, как правильно составить шаблон для регулярного выражения в 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 Помогите, пожалуйста, правильно написать правильный шаблон, чтобы всё примеры корректно парсил |