Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / regexp_like и ИНН / 13 сообщений из 13, страница 1 из 1
28.04.2021, 13:03
    #40066680
Albatross
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp_like и ИНН
Привет!
Есть выражение

REGEXP_LIKE(txt, '[0-9]{10,12}')

как бы её переписать, чтобы всякие '1234567890ТЕСТ' не пролазили? нужно ровно 10 или ровно 12 цифр.
...
Рейтинг: 0 / 0
28.04.2021, 13:06
    #40066682
PuM256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp_like и ИНН
^[0-9]{10,12}$
...
Рейтинг: 0 / 0
28.04.2021, 13:07
    #40066684
Albatross
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp_like и ИНН
PuM256,
спасибо!
...
Рейтинг: 0 / 0
28.04.2021, 13:09
    #40066688
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp_like и ИНН
PuM256
^[0-9]{10,12}$
Нужно ровно 10 или ровно 12. А 11 не нужно.
...
Рейтинг: 0 / 0
28.04.2021, 13:19
    #40066698
PuM256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp_like и ИНН
Да, не обратил внимания на эту хотелку автора.

^([0-9]{10}|[0-9]{12})$
...
Рейтинг: 0 / 0
28.04.2021, 13:23
    #40066702
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp_like и ИНН
PuM256
Да, не обратил внимания на эту хотелку автора.

^([0-9]{10}|[0-9]{12})$

^([0-9]{10}([0-9]{2})?)$
...
Рейтинг: 0 / 0
28.04.2021, 13:45
    #40066715
Алымов Анатолий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp_like и ИНН
Лучше функцию проверки написать с высчитыванием контрольного числа. То что строка содержит 10 или 12 цифр ещё не означает что это ИНН
...
Рейтинг: 0 / 0
28.04.2021, 14:21
    #40066733
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp_like и ИНН
Давайте меряться, чей регэксп короче.
Код: plsql
1.
'^\d{10}(\d\d)?$'
...
Рейтинг: 0 / 0
28.04.2021, 14:31
    #40066745
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp_like и ИНН
Алымов Анатолий
Лучше функцию проверки написать с высчитыванием контрольного числа. То что строка содержит 10 или 12 цифр ещё не означает что это ИНН

Даже если контрольное число совпадет это тоже не означает что это ИНН
...
Рейтинг: 0 / 0
28.04.2021, 14:32
    #40066746
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp_like и ИНН
Алымов Анатолий
Лучше функцию проверки написать с высчитыванием контрольного числа. То что строка содержит 10 или 12 цифр ещё не означает что это ИНН

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
declare
  procedure assert_inn(i_inn varchar2) is
    la_coeff_10 sys.odcinumberlist  := sys.odcinumberlist(2,4,10,3,5,9,4,6,8,0);
    la_coeff_121 sys.odcinumberlist := sys.odcinumberlist(7,2,4,10,3,5,9,4,6,8,0);
    la_coeff_122 sys.odcinumberlist := sys.odcinumberlist(3,7,2,4,10,3,5,9,4,6,8,0);
    procedure assert_cs(i_inn varchar2, io_coeff in out nocopy sys.odcinumberlist) is
      l_calc number := 0;
    begin
      for i in 1..io_coeff.count loop
        l_calc := l_calc + io_coeff(i)*to_number(substr(i_inn,i,1),'0');
      end loop;
      case to_char(mod(mod(l_calc,11),10),'fm0') 
        when substr(i_inn,io_coeff.count,1) then null;
        else raise_application_error(-20000,'ИНН не валиден: "'||i_inn||'"');
      end case;       
    end;
  begin
    case length(i_inn)
      when 10 then
        assert_cs(i_inn,la_coeff_10);
      when 12 then
        assert_cs(i_inn,la_coeff_121);
        assert_cs(i_inn,la_coeff_122);
    else
      raise VALUE_ERROR;
    end case;
  exception
    when VALUE_ERROR then
      raise_application_error(-20000,'ИНН должен состоять из 10 либо 12 цифр, получено "'||i_inn||'"');
  end;
begin
  assert_inn('7830002293');
  assert_inn('500100732259');
end;
/
...
Рейтинг: 0 / 0
28.04.2021, 15:16
    #40066764
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp_like и ИНН
AmKad
Давайте меряться, чей регэксп короче.
Код: plsql
1.
'^\d{10}(\d\d)?$'

давай
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with v(s) as (
select '012345678' from dual union all
select '0123456789' from dual union all
select '01234567890' from dual union all
select '012345678901' from dual union all
select '0123456789012' from dual 
)
select
  case when regexp_like(s, '^\d{10}(\d\d)?$') then 'y' else 'n' end amkad
 ,case when regexp_like(s, '^(\d{2}){5,6}$') then 'y' else 'n' end mine
from v
/
...
Рейтинг: 0 / 0
28.04.2021, 15:31
    #40066771
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp_like и ИНН
Sayan Malakshinov
давай
Уделал.
...
Рейтинг: 0 / 0
28.04.2021, 15:46
    #40066783
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp_like и ИНН
AmKad
Sayan Malakshinov
давай
Уделал.
и даже группа тут не нужна:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with v(s) as (
select '012345678' from dual union all
select '0123456789' from dual union all
select '01234567890' from dual union all
select '012345678901' from dual union all
select '0123456789012' from dual 
)
select
  case when regexp_like(s, '^\d{10}(\d\d)?$') then 'y' else 'n' end amkad
 ,case when regexp_like(s, '^(\d{2}){5,6}$') then 'y' else 'n' end mine
 ,case when regexp_like(s, '^\d{2}{5,6}$') then 'y' else 'n' end mine2
from v
/
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / regexp_like и ИНН / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]