03.06.2020, 14:17
|
Интересующийся
|
|
Регистрация: 12.10.2018
Сообщений: 22
|
|
Как на регулярном запретить некоторые коды
Пришло ФЛК от ФТС, где код таможенного органа проверяется так:
- соответствует коду российского таможенного органа (первые два символа = "10");
- не может принимать значения, равные "10ХХХ000", 10131ХХХ, 10228ХХХ, 10323ХХХ, 10418ХХХ, 10511ХХХ, 1062ХХХХ, 1072ХХХХ, 10805ХХХ, 10000010, 10006060, 10210220, 10309190, 10317120, 10005030, ...
Как с помощью регулярных исключить появление 10805ХХХ либо 10005030 ?
|
|
03.06.2020, 14:37
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
/10\d{3}000 | 10131\d{3} | 1062\d{4} | и т.д./ для значений с возможными любыми, а для 10000010, 10006060 и т.п., и если их много описать массивом.
|
|
03.06.2020, 14:50
|
Интересующийся
|
|
Регистрация: 12.10.2018
Сообщений: 22
|
|
т.е. мы не ИСКЛЮЧАЕМ а ПРОВЕРЯЕМ ВХОЖДЕНИЕ в некий список
На самом деле сам код таможенного органа проверяется по
^[0-9]{2}|[0-9]{5}|[0-9]{8}$
Нельзя ли проверку корректности совместить с исключениями в одном выражении?
|
|
03.06.2020, 15:30
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от varjaginm
|
т.е. мы не ИСКЛЮЧАЕМ а ПРОВЕРЯЕМ ВХОЖДЕНИЕ в некий список
|
Наличие чего-то в чем-то можно трактовать как удачей, так и несчастьем. Так и с номерами, если нужно определить является ли некий входной номер нежелательным, то проверяем его вхождение в ранее описанную коллекцию таковых. Если это куча номеров и в них нужно удалить нежелательные, то удаляем те, которые описаны коллекцией.
[0-9] это и есть \d.
[0-9]{2}|[0-9]{5}|[0-9]{8} - означает либо две цифры, либо пять, либо восемь, и зачем такая проверка я не знаю.
|
|
03.06.2020, 15:38
|
Интересующийся
|
|
Регистрация: 12.10.2018
Сообщений: 22
|
|
маска говорит об уровне таможенного органа, приходит к нам для использования "как есть"
Предложенное решение заставляет переписывать программу для включения некоей "второй" проверки. Этого бы очень не хотелось
Если бы "Правильно/Неправильно" можно было совместить в одном выражении, пусть даже очень длинном, все свелось бы к единственному изменению в управляющей таблице.
|
|
03.06.2020, 15:53
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от 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, '')) //удаляем нежелательное
А можно просто найти и затем по результату что-то выполнить.
|
|
03.06.2020, 15:58
|
Интересующийся
|
|
Регистрация: 12.10.2018
Сообщений: 22
|
|
Про массив я понял, это интересно, хоть и переписка программы
Спасибо!
|
|
03.06.2020, 16:03
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Вы не ответили что за белиберда такая ^[0-9]{2}|[0-9]{5}|[0-9]{8}$. Еще можно понять, что некий номер нужно анализировать как группы, для этого получаем две первых цифры и последующие за ними, которых может быть от 5 до 8. Тогда выражение будет
^(\d{2})(\d{5,8})$
а то что у вас, это фиг знает что, ибо оно никак не соответствует номерам представленным.
|
|
03.06.2020, 18:37
|
Интересующийся
|
|
Регистрация: 12.10.2018
Сообщений: 22
|
|
Да, эту белиберду можно записать и по-другому
но (\d{5,8}) как я понимаю, от 5 до 8, что в корне неправильно
А белиберда говорит о том, что это центральные, региональные подразделения либо непосредственно таможенные посты
|
|
04.06.2020, 05:12
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от 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
|
Нельзя ли проверку корректности совместить с исключениями в одном выражении?
|
Как видите, можно!
|
|
|
|