Javascript-форум (https://javascript.ru/forum/)
-   Internet Explorer (https://javascript.ru/forum/css-html-internet-explorer/)
-   -   Как на регулярном запретить некоторые коды (https://javascript.ru/forum/css-html-internet-explorer/80425-kak-na-regulyarnom-zapretit-nekotorye-kody.html)

varjaginm 03.06.2020 14:17

Как на регулярном запретить некоторые коды
 
Пришло ФЛК от ФТС, где код таможенного органа проверяется так:
- соответствует коду российского таможенного органа (первые два символа = "10");
- не может принимать значения, равные "10ХХХ000", 10131ХХХ, 10228ХХХ, 10323ХХХ, 10418ХХХ, 10511ХХХ, 1062ХХХХ, 1072ХХХХ, 10805ХХХ, 10000010, 10006060, 10210220, 10309190, 10317120, 10005030, ...

Как с помощью регулярных исключить появление 10805ХХХ либо 10005030 ?

laimas 03.06.2020 14:37

/10\d{3}000 | 10131\d{3} | 1062\d{4} | и т.д./ для значений с возможными любыми, а для 10000010, 10006060 и т.п., и если их много описать массивом.

varjaginm 03.06.2020 14:50

т.е. мы не ИСКЛЮЧАЕМ а ПРОВЕРЯЕМ ВХОЖДЕНИЕ в некий список
На самом деле сам код таможенного органа проверяется по
^[0-9]{2}|[0-9]{5}|[0-9]{8}$
Нельзя ли проверку корректности совместить с исключениями в одном выражении?

laimas 03.06.2020 15:30

Цитата:

Сообщение от varjaginm
т.е. мы не ИСКЛЮЧАЕМ а ПРОВЕРЯЕМ ВХОЖДЕНИЕ в некий список

Наличие чего-то в чем-то можно трактовать как удачей, так и несчастьем. Так и с номерами, если нужно определить является ли некий входной номер нежелательным, то проверяем его вхождение в ранее описанную коллекцию таковых. Если это куча номеров и в них нужно удалить нежелательные, то удаляем те, которые описаны коллекцией.

[0-9] это и есть \d.

[0-9]{2}|[0-9]{5}|[0-9]{8} - означает либо две цифры, либо пять, либо восемь, и зачем такая проверка я не знаю.

varjaginm 03.06.2020 15:38

маска говорит об уровне таможенного органа, приходит к нам для использования "как есть"
Предложенное решение заставляет переписывать программу для включения некоей "второй" проверки. Этого бы очень не хотелось
Если бы "Правильно/Неправильно" можно было совместить в одном выражении, пусть даже очень длинном, все свелось бы к единственному изменению в управляющей таблице.

laimas 03.06.2020 15:53

Цитата:

Сообщение от varjaginm
маска говорит об уровне таможенного органа

Если это проверка N номеров которые определяют чей таможенный орган (соответствует коду российского таможенного органа первые два символа = "10"), то что тогда такое дальше определяется?

Вы спросили как проверить/исключить, я написал, например:

let dep = ['10\\d{3}00', '10333\\d{2}', 1089422], //номера нежелательные
n = '1023244 1057600 1023200 1032344 1033355 1089422 1011122'; //проверяемые номера

let re = new RegExp(dep.join('|'), 'g'); //готовим краштест 

console.log(n.replace(re, '')) //удаляем нежелательное


А можно просто найти и затем по результату что-то выполнить.

varjaginm 03.06.2020 15:58

Про массив я понял, это интересно, хоть и переписка программы
Спасибо!

laimas 03.06.2020 16:03

Вы не ответили что за белиберда такая ^[0-9]{2}|[0-9]{5}|[0-9]{8}$. Еще можно понять, что некий номер нужно анализировать как группы, для этого получаем две первых цифры и последующие за ними, которых может быть от 5 до 8. Тогда выражение будет

^(\d{2})(\d{5,8})$


а то что у вас, это фиг знает что, ибо оно никак не соответствует номерам представленным.

varjaginm 03.06.2020 18:37

Да, эту белиберду можно записать и по-другому
но (\d{5,8}) как я понимаю, от 5 до 8, что в корне неправильно
А белиберда говорит о том, что это центральные, региональные подразделения либо непосредственно таможенные посты

Malleys 04.06.2020 05:12

Цитата:

Сообщение от varjaginm
На самом деле сам код таможенного органа проверяется по
^[0-9]{2}|[0-9]{5}|[0-9]{8}$

Который можно записать так...
/^\d{2}|\d{5}|\d{8}$/

А затем сгруппировать так, что бы можно было дописывать дополнительные проверки...
/^(?:\d{2}|\d{5}|\d{8})$/


Такое регулярное выражение находит любые двух-, пяти- и восьмизначные целые положительные числа.

Цитата:

Сообщение от varjaginm
Как с помощью регулярных [выражении] исключить появление 10805ХХХ либо 10005030?

Чтобы исключить среди восьмизначных чисел появление определённых чисел, вам у соответствующей группы следует при помощи (?!) указать не нужные числа.

/^(?:\d{2}|\d{5}|(?!10805\d{3}|10005030)\d{8})$/


Цитата:

Сообщение от varjaginm
Нельзя ли проверку корректности совместить с исключениями в одном выражении?

Как видите, можно!

varjaginm 04.06.2020 13:38

А вот это то самое, что и хотелось!
Большое спасибо!
Тему закрываем


Часовой пояс GMT +3, время: 15:45.