Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > RegExp > Шаблон RegExp_Replace


Автор: him_himbeere 27.03.19, 08:11
Здравствуйте! Подскажите, пожалуйста, как правильно составить шаблон для регулярного выражения в 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

Помогите, пожалуйста, правильно написать правильный шаблон, чтобы всё примеры корректно парсил

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