Да, вы можете:
^(?:BE)?\s*[0-1]?(\d[. ]*){9}$
Это регулярное выражение должно делать это!
Этот источник (на голландском языке) указывает, для чего нужен номер предприятияБельгия:
У него есть код страны: BE
, за которым следует 0
или 1
, а затем 9 цифр.
https://regex101.com/r/4SRHxi/4
Объяснение:
^
: строка должна начинаться с заданного регулярного выражения (?:BE)?
: искать группу с BE, но ?
означает, что она соответствует нулюили один раз - ?:
означает поиск, но не захватывает \s*
: поиск пробела, который соответствует нулю или неограниченному числу раз [0-1]?
: проверить, равен ли ноль единицеприсутствует ноль или один раз ((\d[. ]*){9})
: Проверьте, следуют ли 9 цифр за оставшейся строкой, независимо от того, сколько точек или пробелов они дополняют.Каждая итерация фиксируется как 1-я группа захвата.Это становится важным, когда мы заменим позже. $
: строка должна заканчиваться
Это проверит, проверяет ли ввод.
Редактирование его вcode
версия проста:
«code».replace(/^(?:BE)?\s*[0-1]?((\d[. ]*){9})$/g, function(){
return arguments[1].replace(/\D/g, "");
});
g
или глобальный модификатор обеспечит удаление всех нежелательных символов.Используя функцию с заменой для замены всех нецифровых символов.Эта функция выведет желаемый результат.
document.querySelector("pre").textContent.split("\n").forEach(function(element){
if (element.match(/^(?:BE)?\s*[0-1]?(\d[. ]*){9}$/))
{
console.log(element.replace(/^(?:BE)?\s*[0-1]?((\d[. ]*){9})$/g, function(){
return arguments[1].replace(/\D/g, "");
}));
}
else
{
console.log(`REJECTED: ${element}`);
}
});
BE 0123.321.123
BE0123.321.123
BE0123 321 123
BE 0123 321 123
BE 01 23 32 11 23
BE 0123 32 11 23
1123.321.123
123.321.123
123321123
AAA3434343A
BE 1233 445 4545 442
Восстановление строки в правильном удобном для пользователя виде теперь легко:
document.querySelector("pre").textContent.split("\n").forEach(function(element) {
if (element.match(/^(?:BE)?\s*[0-1]?((\d[. ]*){9})$/)) {
var stripped = element.replace(/^(?:BE)?\s*[0-1]?((\d[. ]*){9})$/g, function(){
return arguments[1].replace(/\D/g, "");
});
//with the modulo check from your code added back in.
if (97 - (parseInt(stripped.slice(0, 7), 10) % 97) == parseInt(stripped.slice(7, 9), 10)) {
//use a literal string
//use substring to put the dots between the sections of three numbers.
var humanReadable = `BE 0${stripped.substring(0,3)}.${stripped.substring(3,6)}.${stripped.substring(6,9)}`;
console.log(`CODE: ${stripped}`, `UI: ${humanReadable}`);
}
}
});
BE 0123.321.123
BE0123.321.123
BE0123 321 123
0123.321.123
123.321.123
123321123
844256524
Второй вопрос Да, это можно сделать, однако для этого требуется написать собственный коддля него.
Простая версия:
document.querySelector("div.enterprisenumber > input").addEventListener("keydown", function(e) {
let value = this.value;
//prevent the input from going back to 0
if ( (value.length == 0 && (e.key == "Backspace" || e.key == "Delete"))) {
e.preventDefault();
return false;
}
}, true);
document.querySelector("div.enterprisenumber > input").addEventListener("keyup", function(e) {
//reset to a value without dots
let value = this.value.replace(/\./g, "");
//strip the leading zero
const valueWithout = value;
//calculate how much iterations we need of a groups of three digits.
const i = Math.floor(valueWithout.length / 3);
let newValue = "";
//check if backspace or delete are used to make sure the dot can be deleted.
if (valueWithout.length < 9 && !(e.key == "Backspace" || e.key == "Delete")) {
//only fire when higher than zero
if (i > 0) {
let t;
//t is the index
for (t = 0; t < i; t++) {
//slice the correct portion of the string and append a dot, unless we are at the end of the groups
newValue += valueWithout.slice(t * 3, t * 3 + 3) + (t == 2 ? "" : ".");
}
//append the remainder that is not a group of three.
newValue += valueWithout.slice((t) * 3);
} else {
//return the value as is.
newValue = value;
}
//set the new value to the input.
this.value = newValue;
}
}, true);
document.querySelector("div.enterprisenumber > input").addEventListener("blur", function(e) {
let passed = false;
if (this.value.match(/^(?:BE)?\s*[0-1]?((\d[. ]*){9})$/))
{
const value = this.value.replace(/\./g, "");
//with modulo check
if (97 - (parseInt(value.slice(0,7), 10) % 97) == value.slice(7, 9))
{
passed = true;
}
}
document.querySelector(".enterprisenumber").classList[(passed ? "remove" : "add")]("error");
});
//if focus then focus input
document.querySelector("div.enterprisenumber").addEventListener("click", function(e) {
if (e.target && e.target.nodeName != "SELECT")
{
this.querySelector("input").focus();
}
});
* {
box-sizing: border-box;
font-family: tahoma;
font-size: 10pt;
}
div.enterprisenumber {
border: 1px solid #747474;
width: 300px;
padding: 0px;
display: grid;
grid-template-columns: 25px 40px auto;
border-radius: 10px;
}
div.enterprisenumber.error {
border: 1px solid #ff0000;
}
div.enterprisenumber>span {
grid-column: 1;
border: 0px;
padding: 5px;
background: linear-gradient(to right, rgba(0,0,0, 0.8) 33%, rgba(255,243,54, 0.8) 33%, rgba(255, 243, 54, 0.8) 66%, rgba(255, 15, 33, 0.8) 66%, rgba(255, 15, 33, 0.8) 100%);
color: #ffffff;
font-weight: bold;
text-shadow: 1px 1px #000000;
border-radius: 10px 10px 10px 10px;
}
div.enterprisenumber>select {
grid-column: 2;
border: 0px;
padding: 5px;
}
div.enterprisenumber>input {
grid-column: 3;
border: 0px;
padding: 5px;
border-radius: 0px 10px 10px 0px;
}
Enter: 844256524
<div class="enterprisenumber">
<span>BE</span><select><option value="0">0</option><option value="1">1</option><input value="" maxlength="11" />
</div>