<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414459&amp;view=findpost&amp;p=3794030</guid>
        <pubDate>Wed, 27 Mar 2019 08:11:58 +0000</pubDate>
        <title>Шаблон RegExp_Replace</title>
        <link>https://forum.sources.ru/index.php?showtopic=414459&amp;view=findpost&amp;p=3794030</link>
        <description><![CDATA[him_himbeere: Здравствуйте&#33; Подскажите, пожалуйста, как правильно составить шаблон для регулярного выражения в PL SQL Developer.<br>
Есть поле, в котором содержится информация о номерах договоров и датами их заключения. В номерах договоров могут быть и пробелы, и буквы с цифрами, и тире и скобки и слешы, в общем - все знаки пукнутации<br>
<br>
К примеру, поле &#39;1234 от 19.10.2016, 23456 от 08.01.2017&#39;.<br>
<br>
Если написать шаблон так, то всё верно работает:<br>
<br>
select<br>
RegExp_Replace(&#39;1234 от 19.10.2016, 23456 от 08.01.2017&#39;, <br>
               &#39;([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}&#092;.[[:digit:]]{2}&#092;.[[:digit:]]{2,4})&#39;, <br>
                    &#39;&#092;1&#39;) S1, -- Номер договора<br>
RegExp_Replace(&#39;1234 от 19.10.2016, 23456 от 08.01.2017&#39;, <br>
               &#39;([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}&#092;.[[:digit:]]{2}&#092;.[[:digit:]]{2,4})&#39;, <br>
               &#39;&#092;2&#39;) as S2, <br>
RegExp_Replace(&#39;1234 от 19.10.2016, 23456 от 08.01.2017&#39;, <br>
               &#39;([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}&#092;.[[:digit:]]{2}&#092;.[[:digit:]]{2,4})&#39;, <br>
               &#39;&#092;3&#39;) as S3 -- Дата договора                                  <br>
from dual;<br>
<br>
Результат:<br>
S1 = 1234, 23456<br>
S2 = от ,  от<br>
S3 = 19.10.2016, 08.01.2017<br>
<br>
Но дело в том, что может быть через запятую несколько договоров и дат, например &#39;Rc13353, Gt53381, Uy53384 от 08.01.2017, Gtu3382 и Gkhd880 от 10.01.2017&#39;, <br>
или номера договоров указаны через пробел, например &#39;&#39;<br>
И тогда уже этот шаблон не работает, так как есть пробелы:<br>
select<br>
RegExp_Replace(&#39;Rc13353, Gt53381, Uy53384 от 08.01.2017, Gtu3382 и Gkhd880 от 10.01.2017&#39;, <br>
               &#39;([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}&#092;.[[:digit:]]{2}&#092;.[[:digit:]]{2,4})&#39;, <br>
                    &#39;&#092;1&#39;) S1, -- Номер договора<br>
RegExp_Replace(&#39;Rc13353, Gt53381, Uy53384 от 08.01.2017, Gtu3382 и Gkhd880 от 10.01.2017&#39;, <br>
               &#39;([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}&#092;.[[:digit:]]{2}&#092;.[[:digit:]]{2,4})&#39;, <br>
               &#39;&#092;2&#39;) as S2, <br>
RegExp_Replace(&#39;Rc13353, Gt53381, Uy53384 от 08.01.2017, Gtu3382 и Gkhd880 от 10.01.2017&#39;, <br>
               &#39;([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}&#092;.[[:digit:]]{2}&#092;.[[:digit:]]{2,4})&#39;, <br>
               &#39;&#092;3&#39;) as S3 -- Дата договора                                  <br>
from dual;<br>
<br>
Результат:<br>
S1 = Rc13353, Gt53381, Uy53384, Gtu3382 и Gkhd880<br>
S2 = Rc13353, Gt53381,  от , Gtu3382 и  от <br>
S3 = Rc13353, Gt53381, 08.01.2017, Gtu3382 и 10.01.2017<br>
<br>
<br>
select<br>
RegExp_Replace(&#39;O(d) L123 от 08.01.2017&#39;, <br>
               &#39;([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}&#092;.[[:digit:]]{2}&#092;.[[:digit:]]{2,4})&#39;, <br>
                    &#39;&#092;1&#39;) S1, -- Номер договора<br>
RegExp_Replace(&#39;O(d) L123 от 08.01.2017&#39;, <br>
               &#39;([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}&#092;.[[:digit:]]{2}&#092;.[[:digit:]]{2,4})&#39;, <br>
               &#39;&#092;2&#39;) as S2, <br>
RegExp_Replace(&#39;O(d) L123 от 08.01.2017&#39;, <br>
               &#39;([[:alnum:][:punct:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}&#092;.[[:digit:]]{2}&#092;.[[:digit:]]{2,4})&#39;, <br>
               &#39;&#092;3&#39;) as S3 -- Дата договора                                  <br>
from dual;<br>
<br>
Результат:<br>
S1 = O(d) L123<br>
S2 = O(d)  от  <br>
S3 = O(d) 08.01.2017<br>
<br>
Если в шаблон в первую часть добавить пробел, то он распознает почему-то только последнюю дату, если их две указано, не распознает по шаблону дату в середине строки:<br>
<br>
Шаблон = &#39;([[:alnum:][:punct:][:space:]]*)([[:space:]]*[[:alpha:]]{2}[[:space:]]*)([[:digit:]]{2}&#092;.[[:digit:]]{2}&#092;.[[:digit:]]{2,4})&#39;<br>
<br>
Результаты:<br>
1. &#39;1234 от 19.10.2016, 23456 от 08.01.2017&#39;<br>
   S1 = 1234 от 19.10.2016, 23456 <br>
   S2 = от <br>
   S3 = 08.01.2017<br>
2. &#39;Rc13353, Gt53381, Uy53384 от 08.01.2017, Gtu3382 и Gkhd880 от 10.01.2017&#39;<br>
   S1 = Rc13353, Gt53381, Uy53384 от 08.01.2017, Gtu3382 и Gkhd880 <br>
   S2 = от <br>
   S3 = 10.01.2017<br>
3. &#39;O(d) L123 от 08.01.2017&#39;<br>
   S1 = O(d) L123<br>
   S2 = от <br>
   S3 = 08.01.2017<br>
<br>
Помогите, пожалуйста, правильно написать правильный шаблон, чтобы всё примеры корректно парсил]]></description>
        <author>him_himbeere</author>
        <category>RegExp</category>
      </item>
	
      </channel>
      </rss>
	