Can this function be rewritten with a regex?2019 Community Moderator ElectionIs there an “exists”...

Why does Starman/Roadster have radial acceleration?

Which aircraft had such a luxurious-looking navigator's station?

How would we write a misogynistic character without offending people?

How to speed up a process

Non-Italian European mafias in USA?

Is there a frame of reference in which I was born before I was conceived?

How do I construct an nxn matrix?

Why is working on the same position for more than 15 years not a red flag?

Compare four integers, return word based on maximum

Whom do I have to contact for a ticket refund in case of denied boarding (in the EU)?

Where is this triangular-shaped space station from?

Why does the author believe that the central mass that gas cloud HCN-0.009-0.044 orbits is smaller than our solar system?

Hacker Rank: Array left rotation

Can you use a beast's innate abilities while polymorphed?

What if I store 10TB on azure servers and then keep the vm powered off?

What is the difference between throw e and throw new Exception(e)?

Multiplication via squaring and addition

Why zero tolerance on nudity in space?

Can you 'upgrade' leather armor to studded leather armor without purchasing the new armor directly?

What is better: yes / no radio, or simple checkbox?

How to approximate rolls for potions of healing using only d6's?

If nine coins are tossed, what is the probability that the number of heads is even?

Should I choose Itemized or Standard deduction?

Has the Isbell–Freyd criterion ever been used to check that a category is concretisable?



Can this function be rewritten with a regex?



2019 Community Moderator ElectionIs there an “exists” function for jQuery?How can I upload files asynchronously?How can I merge properties of two JavaScript objects dynamically?How can I convert a string to boolean in JavaScript?var functionName = function() {} vs function functionName() {}How can I know which radio button is selected via jQuery?Set a default parameter value for a JavaScript functionHow can I get query string values in JavaScript?How can I refresh a page with jQuery?Can (a== 1 && a ==2 && a==3) ever evaluate to true?












7















I want to reformat and validate if a user has provided a valid Belgian enterprise number. Because the input can be all of the following examples:




  • BE 0123.321.123

  • BE0123.321.123

  • BE0123 321 123

  • 0123.321.123

  • 123.321.123

  • 123321123


I've written a function that validates and reformat the input to a 'display' version (BE 0123.123.123) and a 'code' version (123123123). This function looks like this.



formatAndValidateEnterpriseNumber = enterpriseNumber => {
if(enterpriseNumber === undefined || !enterpriseNumber || (enterpriseNumber || '').length < 3) return { isValid: false, error: 'Please fill in your enterprise number' };

//Remove space, dots, ...
enterpriseNumber = enterpriseNumber.toUpperCase();
enterpriseNumber = enterpriseNumber.replace(/[. ,:-]+/g, '');

//Check for double country code
const reDouble = /^[a-zA-Z]{4}/;
if (reDouble.test(enterpriseNumber)) enterpriseNumber = enterpriseNumber.substring(2);

if (enterpriseNumber.length < 9 || enterpriseNumber.length > 12) return { isValid: false, error: 'The length of the provided number is incorrect' };

//Check country code
const reBE = /^[a-zA-Z]{2}/;
if (reBE.test(enterpriseNumber)) {
//Check if country code = BE
if (enterpriseNumber.slice(0, 2) !== 'BE') return { isValid: false, error: 'Please fill in a Belgian enterprise number' };
// Remove country code
else enterpriseNumber = enterpriseNumber.substring(2);
}

//Check if first digit is 0
if (enterpriseNumber.length === 10 && enterpriseNumber.startsWith('0')) enterpriseNumber = enterpriseNumber.substring(1);

//Check if enterpriseNumber is valid with modulo test
if (parseInt(97 - (enterpriseNumber.slice(0, 7) % 97), 10) !== parseInt(enterpriseNumber.slice(7, 9), 10))
return { isValid: false, error: 'The provided number is invalid'}

return {
isValid: true,
enterpriseNumber: enterpriseNumber,
displayEnterpriseNumber: `BE 0${enterpriseNumber.substring(0, 3)}.${enterpriseNumber.substring(3, 6)}.${enterpriseNumber.substring(6, 9)}`
};
};


I think it's pretty messy and I'm wondering if this can be improved with one/two regex tests that reformat and validate the user's input?



A second question: Sometimes for account or credit cards numbers the input field had those underscores and lines (-) already in the input box and reformat the number while typing. What is this method called and can this be done for a specific thing like a Belgian enterprise number?










share|improve this question























  • The modulo test is not easily possible in regex.

    – trincot
    3 hours ago
















7















I want to reformat and validate if a user has provided a valid Belgian enterprise number. Because the input can be all of the following examples:




  • BE 0123.321.123

  • BE0123.321.123

  • BE0123 321 123

  • 0123.321.123

  • 123.321.123

  • 123321123


I've written a function that validates and reformat the input to a 'display' version (BE 0123.123.123) and a 'code' version (123123123). This function looks like this.



formatAndValidateEnterpriseNumber = enterpriseNumber => {
if(enterpriseNumber === undefined || !enterpriseNumber || (enterpriseNumber || '').length < 3) return { isValid: false, error: 'Please fill in your enterprise number' };

//Remove space, dots, ...
enterpriseNumber = enterpriseNumber.toUpperCase();
enterpriseNumber = enterpriseNumber.replace(/[. ,:-]+/g, '');

//Check for double country code
const reDouble = /^[a-zA-Z]{4}/;
if (reDouble.test(enterpriseNumber)) enterpriseNumber = enterpriseNumber.substring(2);

if (enterpriseNumber.length < 9 || enterpriseNumber.length > 12) return { isValid: false, error: 'The length of the provided number is incorrect' };

//Check country code
const reBE = /^[a-zA-Z]{2}/;
if (reBE.test(enterpriseNumber)) {
//Check if country code = BE
if (enterpriseNumber.slice(0, 2) !== 'BE') return { isValid: false, error: 'Please fill in a Belgian enterprise number' };
// Remove country code
else enterpriseNumber = enterpriseNumber.substring(2);
}

//Check if first digit is 0
if (enterpriseNumber.length === 10 && enterpriseNumber.startsWith('0')) enterpriseNumber = enterpriseNumber.substring(1);

//Check if enterpriseNumber is valid with modulo test
if (parseInt(97 - (enterpriseNumber.slice(0, 7) % 97), 10) !== parseInt(enterpriseNumber.slice(7, 9), 10))
return { isValid: false, error: 'The provided number is invalid'}

return {
isValid: true,
enterpriseNumber: enterpriseNumber,
displayEnterpriseNumber: `BE 0${enterpriseNumber.substring(0, 3)}.${enterpriseNumber.substring(3, 6)}.${enterpriseNumber.substring(6, 9)}`
};
};


I think it's pretty messy and I'm wondering if this can be improved with one/two regex tests that reformat and validate the user's input?



A second question: Sometimes for account or credit cards numbers the input field had those underscores and lines (-) already in the input box and reformat the number while typing. What is this method called and can this be done for a specific thing like a Belgian enterprise number?










share|improve this question























  • The modulo test is not easily possible in regex.

    – trincot
    3 hours ago














7












7








7


1






I want to reformat and validate if a user has provided a valid Belgian enterprise number. Because the input can be all of the following examples:




  • BE 0123.321.123

  • BE0123.321.123

  • BE0123 321 123

  • 0123.321.123

  • 123.321.123

  • 123321123


I've written a function that validates and reformat the input to a 'display' version (BE 0123.123.123) and a 'code' version (123123123). This function looks like this.



formatAndValidateEnterpriseNumber = enterpriseNumber => {
if(enterpriseNumber === undefined || !enterpriseNumber || (enterpriseNumber || '').length < 3) return { isValid: false, error: 'Please fill in your enterprise number' };

//Remove space, dots, ...
enterpriseNumber = enterpriseNumber.toUpperCase();
enterpriseNumber = enterpriseNumber.replace(/[. ,:-]+/g, '');

//Check for double country code
const reDouble = /^[a-zA-Z]{4}/;
if (reDouble.test(enterpriseNumber)) enterpriseNumber = enterpriseNumber.substring(2);

if (enterpriseNumber.length < 9 || enterpriseNumber.length > 12) return { isValid: false, error: 'The length of the provided number is incorrect' };

//Check country code
const reBE = /^[a-zA-Z]{2}/;
if (reBE.test(enterpriseNumber)) {
//Check if country code = BE
if (enterpriseNumber.slice(0, 2) !== 'BE') return { isValid: false, error: 'Please fill in a Belgian enterprise number' };
// Remove country code
else enterpriseNumber = enterpriseNumber.substring(2);
}

//Check if first digit is 0
if (enterpriseNumber.length === 10 && enterpriseNumber.startsWith('0')) enterpriseNumber = enterpriseNumber.substring(1);

//Check if enterpriseNumber is valid with modulo test
if (parseInt(97 - (enterpriseNumber.slice(0, 7) % 97), 10) !== parseInt(enterpriseNumber.slice(7, 9), 10))
return { isValid: false, error: 'The provided number is invalid'}

return {
isValid: true,
enterpriseNumber: enterpriseNumber,
displayEnterpriseNumber: `BE 0${enterpriseNumber.substring(0, 3)}.${enterpriseNumber.substring(3, 6)}.${enterpriseNumber.substring(6, 9)}`
};
};


I think it's pretty messy and I'm wondering if this can be improved with one/two regex tests that reformat and validate the user's input?



A second question: Sometimes for account or credit cards numbers the input field had those underscores and lines (-) already in the input box and reformat the number while typing. What is this method called and can this be done for a specific thing like a Belgian enterprise number?










share|improve this question














I want to reformat and validate if a user has provided a valid Belgian enterprise number. Because the input can be all of the following examples:




  • BE 0123.321.123

  • BE0123.321.123

  • BE0123 321 123

  • 0123.321.123

  • 123.321.123

  • 123321123


I've written a function that validates and reformat the input to a 'display' version (BE 0123.123.123) and a 'code' version (123123123). This function looks like this.



formatAndValidateEnterpriseNumber = enterpriseNumber => {
if(enterpriseNumber === undefined || !enterpriseNumber || (enterpriseNumber || '').length < 3) return { isValid: false, error: 'Please fill in your enterprise number' };

//Remove space, dots, ...
enterpriseNumber = enterpriseNumber.toUpperCase();
enterpriseNumber = enterpriseNumber.replace(/[. ,:-]+/g, '');

//Check for double country code
const reDouble = /^[a-zA-Z]{4}/;
if (reDouble.test(enterpriseNumber)) enterpriseNumber = enterpriseNumber.substring(2);

if (enterpriseNumber.length < 9 || enterpriseNumber.length > 12) return { isValid: false, error: 'The length of the provided number is incorrect' };

//Check country code
const reBE = /^[a-zA-Z]{2}/;
if (reBE.test(enterpriseNumber)) {
//Check if country code = BE
if (enterpriseNumber.slice(0, 2) !== 'BE') return { isValid: false, error: 'Please fill in a Belgian enterprise number' };
// Remove country code
else enterpriseNumber = enterpriseNumber.substring(2);
}

//Check if first digit is 0
if (enterpriseNumber.length === 10 && enterpriseNumber.startsWith('0')) enterpriseNumber = enterpriseNumber.substring(1);

//Check if enterpriseNumber is valid with modulo test
if (parseInt(97 - (enterpriseNumber.slice(0, 7) % 97), 10) !== parseInt(enterpriseNumber.slice(7, 9), 10))
return { isValid: false, error: 'The provided number is invalid'}

return {
isValid: true,
enterpriseNumber: enterpriseNumber,
displayEnterpriseNumber: `BE 0${enterpriseNumber.substring(0, 3)}.${enterpriseNumber.substring(3, 6)}.${enterpriseNumber.substring(6, 9)}`
};
};


I think it's pretty messy and I'm wondering if this can be improved with one/two regex tests that reformat and validate the user's input?



A second question: Sometimes for account or credit cards numbers the input field had those underscores and lines (-) already in the input box and reformat the number while typing. What is this method called and can this be done for a specific thing like a Belgian enterprise number?







javascript regex reformatting






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked 3 hours ago









ThoreThore

453213




453213













  • The modulo test is not easily possible in regex.

    – trincot
    3 hours ago



















  • The modulo test is not easily possible in regex.

    – trincot
    3 hours ago

















The modulo test is not easily possible in regex.

– trincot
3 hours ago





The modulo test is not easily possible in regex.

– trincot
3 hours ago












3 Answers
3






active

oldest

votes


















5














Yes you can:



^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$


This regex should do it!




This source (in Dutch) states what an enterprise number is for Belgium:



It has the country code: BE followed by a 0 or 1 and then followed by 9 digits.




https://regex101.com/r/4SRHxi/3



Explanation:





  • ^ and $: the string has to start and end with the given regex


  • (?:BE)?: look for a group with BE but ? means it matches zero or
    one times - ?: means find but don't capture


  • s?: look for a space or dot that matches zero or one times


  • [0-1]?: check if a zero of one is present zero or one times


  • (d{3}): Check if succeeded by three digits


  • [.s]?: match a dot or a space zero or one times


  • (d{3}): Check if succeeded by three digits


  • [.s]?: again match a dot or a space zero or one times


  • (d{3}): check for last three digits


This will check if the input validates.



Editing it into the code version is simple:



«code».replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3");


the g or global modifier will ensure all unwanted characters will be deleted. Here some magic happens. Since the three digits groups are surrounded by parenthesis the form a group. The (?:BE) does look for that group but doesn't capture it. We can put the groups back using the variables $1 to $3.






document.querySelector("pre").textContent.split("n").forEach(function(element){
if (element.match(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/))
{
console.log(element.replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3"));
}
else
{
console.log(`REJECTED: ${element}`);
}

});

<pre>
BE 0123.321.123
BE0123.321.123
BE0123 321 123
BE 01 23 32 11 23
BE 0123 32 11 23
1123.321.123
123.321.123
123321123
</pre>





Rebuilding the String into the correct user friendly way is easy now:






document.querySelector("pre").textContent.split("n").forEach(function(element) {
if (element.match(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/)) {
var stripped = element.replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3");

//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(humanReadable);
}
}

});

<pre>
BE 0123.321.123
BE0123.321.123
BE0123 321 123
0123.321.123
123.321.123
123321123
</pre>







Second Question
Yes, this can be done however it requires you to write your own code for it.



Simple version:






document.querySelector("div.enterprisenumber > input").addEventListener("keydown", function(e) {
let value = this.value;

//prevent the input from going back to 0
if ( (value.length == 1 && (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.substring(1);
//calculate how much iterations we need of a groups of three digits.
const i = Math.floor(valueWithout.length / 3);
let newValue = "0";
//check if backspace or delete are used to make sure the dot can be deleted.
if (valueWithout.length < 10 && !(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{3})[.s]?(d{3})[.s]?(d{3})$/))
{
const value = this.value.substring(1).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");
});

* {
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 auto;
}

div.enterprisenumber.error {
border: 1px solid #ff0000;
}

div.enterprisenumber>span {
grid-column: 1;
border: 0px;
padding: 3px;
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;
}

div.enterprisenumber>input {
grid-column: 2;
border: 0px;
padding: 3px;
}

<div class="enterprisenumber">
<span>BE</span><input value="0" maxlength="12" />
</div>








share|improve this answer


























  • Wow! Thanks for the explanation. I like the solution. However the modulo test is gone to check if the number is valid (The first 7 digits without the 0 or 1 in front, %97 should be the last two digits).

    – Thore
    1 hour ago











  • that's not that difficult, but not doable in the regexp though.

    – Mouser
    58 mins ago











  • Would you suggest to do it separately? First the regex and then another check for the validation of the number parseInt(97 - (enterpriseNumber.slice(0, 7) % 97), 10) !== parseInt(enterpriseNumber.slice(7, 9), 10

    – Thore
    22 mins ago






  • 1





    See the solutions posted in my answer. Modulo check should be done separately.

    – Mouser
    21 mins ago













  • One last thing. I didn't come up with these examples in my code but something like BE 01 23 32 11 23 or a group separated with more than one space will return false?

    – Thore
    12 mins ago



















2














For your example strings, you could match:



^(?:BEs?)?[01]?(d{3}([. ])d{3}2d{3}|d{9})$


That will match





  • ^ Start of string


  • (?:BEs?)? Optional BE followed by optional whitespace char


  • [01]? Optional zero or 1


  • ( Capturing group



    • d{3} Match 3 digits


    • ([. ]) Capture in group either a space or digit to use as backreference


    • d{3}2d{3} Match 3 digits, dot or space (2 is the backreference) and 3 digits


    • | Or


    • d{9} Match 9 digits




  • ) Close capturing group


  • $ End of string


Regex demo



And then in the replacement use the first capturing group and replace the space or the dot with an empty string.






let pattern = /^(?:BEs?)?[01]?(d{3}([. ])d{3}2d{3}|d{9})$/;
let strings = [
"BE 0123.321.123",
"BE0123.321.123",
"BE0123 321 123",
"0123.321.123",
"123.321.123",
"123321123",
];

strings = strings.map(x => x.replace(pattern, function(m, g) {
let enterpriseNumber = g.replace(/[. ]/g, "");
return `BE 0${enterpriseNumber.substring(0, 3)}.${enterpriseNumber.substring(3, 6)}.${enterpriseNumber.substring(6, 9)}`
}));

console.log(strings);








share|improve this answer

































    1














    Here is an implementation of a BE ____.___.___ style of input. The pattern will be maintained, so the input will be guaranteed to have the "BE" prefix, the space, and the two dots. The validation can then concentrate on completeness and the modulo test.



    Note that the input requires the first group to have 4 digits, where the first digit must be a 0 or a 1.






    const ent = document.getElementById("ent");
    const out = document.getElementById("isvalid");

    function format() {
    const re = /^D*[2-9]+|D+/g;
    const [i, j] = [this.selectionStart, this.selectionEnd].map(i => {
    i = this.value.slice(0, i).replace(re, "").length;
    return i + 3 + (i >= 4 + format.backspace) + (i >= 7 + format.backspace);
    });
    this.value = "BE " + this.value.replace(re, "").padEnd(10, "_")
    .replace(/(....)(...)(...).*/, "$1.$2.$3");
    this.setSelectionRange(i, j);
    format.backspace = false;
    out.textContent = validate(this.value) ? "is valid" : "is invalid";
    }

    function validate(num) {
    return /^BE [01](d{3}.){2}d{3}$/.test(num)
    && 97 - num.replace(/D/g, "").slice(0, 8) % 97 === +num.slice(-2);
    }

    ent.addEventListener("input", format);
    ent.addEventListener("keydown", (e) => format.backspace = e.key == "Backspace");

    Belgian enterprise number: <input id="ent" value="BE ____.___.___">
    <span id="isvalid"></span>








    share|improve this answer
























    • Wow, that's a nice solution to the second question.

      – Mouser
      20 mins ago











    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54990565%2fcan-this-function-be-rewritten-with-a-regex%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    5














    Yes you can:



    ^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$


    This regex should do it!




    This source (in Dutch) states what an enterprise number is for Belgium:



    It has the country code: BE followed by a 0 or 1 and then followed by 9 digits.




    https://regex101.com/r/4SRHxi/3



    Explanation:





    • ^ and $: the string has to start and end with the given regex


    • (?:BE)?: look for a group with BE but ? means it matches zero or
      one times - ?: means find but don't capture


    • s?: look for a space or dot that matches zero or one times


    • [0-1]?: check if a zero of one is present zero or one times


    • (d{3}): Check if succeeded by three digits


    • [.s]?: match a dot or a space zero or one times


    • (d{3}): Check if succeeded by three digits


    • [.s]?: again match a dot or a space zero or one times


    • (d{3}): check for last three digits


    This will check if the input validates.



    Editing it into the code version is simple:



    «code».replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3");


    the g or global modifier will ensure all unwanted characters will be deleted. Here some magic happens. Since the three digits groups are surrounded by parenthesis the form a group. The (?:BE) does look for that group but doesn't capture it. We can put the groups back using the variables $1 to $3.






    document.querySelector("pre").textContent.split("n").forEach(function(element){
    if (element.match(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/))
    {
    console.log(element.replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3"));
    }
    else
    {
    console.log(`REJECTED: ${element}`);
    }

    });

    <pre>
    BE 0123.321.123
    BE0123.321.123
    BE0123 321 123
    BE 01 23 32 11 23
    BE 0123 32 11 23
    1123.321.123
    123.321.123
    123321123
    </pre>





    Rebuilding the String into the correct user friendly way is easy now:






    document.querySelector("pre").textContent.split("n").forEach(function(element) {
    if (element.match(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/)) {
    var stripped = element.replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3");

    //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(humanReadable);
    }
    }

    });

    <pre>
    BE 0123.321.123
    BE0123.321.123
    BE0123 321 123
    0123.321.123
    123.321.123
    123321123
    </pre>







    Second Question
    Yes, this can be done however it requires you to write your own code for it.



    Simple version:






    document.querySelector("div.enterprisenumber > input").addEventListener("keydown", function(e) {
    let value = this.value;

    //prevent the input from going back to 0
    if ( (value.length == 1 && (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.substring(1);
    //calculate how much iterations we need of a groups of three digits.
    const i = Math.floor(valueWithout.length / 3);
    let newValue = "0";
    //check if backspace or delete are used to make sure the dot can be deleted.
    if (valueWithout.length < 10 && !(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{3})[.s]?(d{3})[.s]?(d{3})$/))
    {
    const value = this.value.substring(1).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");
    });

    * {
    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 auto;
    }

    div.enterprisenumber.error {
    border: 1px solid #ff0000;
    }

    div.enterprisenumber>span {
    grid-column: 1;
    border: 0px;
    padding: 3px;
    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;
    }

    div.enterprisenumber>input {
    grid-column: 2;
    border: 0px;
    padding: 3px;
    }

    <div class="enterprisenumber">
    <span>BE</span><input value="0" maxlength="12" />
    </div>








    share|improve this answer


























    • Wow! Thanks for the explanation. I like the solution. However the modulo test is gone to check if the number is valid (The first 7 digits without the 0 or 1 in front, %97 should be the last two digits).

      – Thore
      1 hour ago











    • that's not that difficult, but not doable in the regexp though.

      – Mouser
      58 mins ago











    • Would you suggest to do it separately? First the regex and then another check for the validation of the number parseInt(97 - (enterpriseNumber.slice(0, 7) % 97), 10) !== parseInt(enterpriseNumber.slice(7, 9), 10

      – Thore
      22 mins ago






    • 1





      See the solutions posted in my answer. Modulo check should be done separately.

      – Mouser
      21 mins ago













    • One last thing. I didn't come up with these examples in my code but something like BE 01 23 32 11 23 or a group separated with more than one space will return false?

      – Thore
      12 mins ago
















    5














    Yes you can:



    ^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$


    This regex should do it!




    This source (in Dutch) states what an enterprise number is for Belgium:



    It has the country code: BE followed by a 0 or 1 and then followed by 9 digits.




    https://regex101.com/r/4SRHxi/3



    Explanation:





    • ^ and $: the string has to start and end with the given regex


    • (?:BE)?: look for a group with BE but ? means it matches zero or
      one times - ?: means find but don't capture


    • s?: look for a space or dot that matches zero or one times


    • [0-1]?: check if a zero of one is present zero or one times


    • (d{3}): Check if succeeded by three digits


    • [.s]?: match a dot or a space zero or one times


    • (d{3}): Check if succeeded by three digits


    • [.s]?: again match a dot or a space zero or one times


    • (d{3}): check for last three digits


    This will check if the input validates.



    Editing it into the code version is simple:



    «code».replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3");


    the g or global modifier will ensure all unwanted characters will be deleted. Here some magic happens. Since the three digits groups are surrounded by parenthesis the form a group. The (?:BE) does look for that group but doesn't capture it. We can put the groups back using the variables $1 to $3.






    document.querySelector("pre").textContent.split("n").forEach(function(element){
    if (element.match(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/))
    {
    console.log(element.replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3"));
    }
    else
    {
    console.log(`REJECTED: ${element}`);
    }

    });

    <pre>
    BE 0123.321.123
    BE0123.321.123
    BE0123 321 123
    BE 01 23 32 11 23
    BE 0123 32 11 23
    1123.321.123
    123.321.123
    123321123
    </pre>





    Rebuilding the String into the correct user friendly way is easy now:






    document.querySelector("pre").textContent.split("n").forEach(function(element) {
    if (element.match(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/)) {
    var stripped = element.replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3");

    //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(humanReadable);
    }
    }

    });

    <pre>
    BE 0123.321.123
    BE0123.321.123
    BE0123 321 123
    0123.321.123
    123.321.123
    123321123
    </pre>







    Second Question
    Yes, this can be done however it requires you to write your own code for it.



    Simple version:






    document.querySelector("div.enterprisenumber > input").addEventListener("keydown", function(e) {
    let value = this.value;

    //prevent the input from going back to 0
    if ( (value.length == 1 && (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.substring(1);
    //calculate how much iterations we need of a groups of three digits.
    const i = Math.floor(valueWithout.length / 3);
    let newValue = "0";
    //check if backspace or delete are used to make sure the dot can be deleted.
    if (valueWithout.length < 10 && !(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{3})[.s]?(d{3})[.s]?(d{3})$/))
    {
    const value = this.value.substring(1).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");
    });

    * {
    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 auto;
    }

    div.enterprisenumber.error {
    border: 1px solid #ff0000;
    }

    div.enterprisenumber>span {
    grid-column: 1;
    border: 0px;
    padding: 3px;
    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;
    }

    div.enterprisenumber>input {
    grid-column: 2;
    border: 0px;
    padding: 3px;
    }

    <div class="enterprisenumber">
    <span>BE</span><input value="0" maxlength="12" />
    </div>








    share|improve this answer


























    • Wow! Thanks for the explanation. I like the solution. However the modulo test is gone to check if the number is valid (The first 7 digits without the 0 or 1 in front, %97 should be the last two digits).

      – Thore
      1 hour ago











    • that's not that difficult, but not doable in the regexp though.

      – Mouser
      58 mins ago











    • Would you suggest to do it separately? First the regex and then another check for the validation of the number parseInt(97 - (enterpriseNumber.slice(0, 7) % 97), 10) !== parseInt(enterpriseNumber.slice(7, 9), 10

      – Thore
      22 mins ago






    • 1





      See the solutions posted in my answer. Modulo check should be done separately.

      – Mouser
      21 mins ago













    • One last thing. I didn't come up with these examples in my code but something like BE 01 23 32 11 23 or a group separated with more than one space will return false?

      – Thore
      12 mins ago














    5












    5








    5







    Yes you can:



    ^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$


    This regex should do it!




    This source (in Dutch) states what an enterprise number is for Belgium:



    It has the country code: BE followed by a 0 or 1 and then followed by 9 digits.




    https://regex101.com/r/4SRHxi/3



    Explanation:





    • ^ and $: the string has to start and end with the given regex


    • (?:BE)?: look for a group with BE but ? means it matches zero or
      one times - ?: means find but don't capture


    • s?: look for a space or dot that matches zero or one times


    • [0-1]?: check if a zero of one is present zero or one times


    • (d{3}): Check if succeeded by three digits


    • [.s]?: match a dot or a space zero or one times


    • (d{3}): Check if succeeded by three digits


    • [.s]?: again match a dot or a space zero or one times


    • (d{3}): check for last three digits


    This will check if the input validates.



    Editing it into the code version is simple:



    «code».replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3");


    the g or global modifier will ensure all unwanted characters will be deleted. Here some magic happens. Since the three digits groups are surrounded by parenthesis the form a group. The (?:BE) does look for that group but doesn't capture it. We can put the groups back using the variables $1 to $3.






    document.querySelector("pre").textContent.split("n").forEach(function(element){
    if (element.match(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/))
    {
    console.log(element.replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3"));
    }
    else
    {
    console.log(`REJECTED: ${element}`);
    }

    });

    <pre>
    BE 0123.321.123
    BE0123.321.123
    BE0123 321 123
    BE 01 23 32 11 23
    BE 0123 32 11 23
    1123.321.123
    123.321.123
    123321123
    </pre>





    Rebuilding the String into the correct user friendly way is easy now:






    document.querySelector("pre").textContent.split("n").forEach(function(element) {
    if (element.match(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/)) {
    var stripped = element.replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3");

    //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(humanReadable);
    }
    }

    });

    <pre>
    BE 0123.321.123
    BE0123.321.123
    BE0123 321 123
    0123.321.123
    123.321.123
    123321123
    </pre>







    Second Question
    Yes, this can be done however it requires you to write your own code for it.



    Simple version:






    document.querySelector("div.enterprisenumber > input").addEventListener("keydown", function(e) {
    let value = this.value;

    //prevent the input from going back to 0
    if ( (value.length == 1 && (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.substring(1);
    //calculate how much iterations we need of a groups of three digits.
    const i = Math.floor(valueWithout.length / 3);
    let newValue = "0";
    //check if backspace or delete are used to make sure the dot can be deleted.
    if (valueWithout.length < 10 && !(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{3})[.s]?(d{3})[.s]?(d{3})$/))
    {
    const value = this.value.substring(1).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");
    });

    * {
    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 auto;
    }

    div.enterprisenumber.error {
    border: 1px solid #ff0000;
    }

    div.enterprisenumber>span {
    grid-column: 1;
    border: 0px;
    padding: 3px;
    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;
    }

    div.enterprisenumber>input {
    grid-column: 2;
    border: 0px;
    padding: 3px;
    }

    <div class="enterprisenumber">
    <span>BE</span><input value="0" maxlength="12" />
    </div>








    share|improve this answer















    Yes you can:



    ^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$


    This regex should do it!




    This source (in Dutch) states what an enterprise number is for Belgium:



    It has the country code: BE followed by a 0 or 1 and then followed by 9 digits.




    https://regex101.com/r/4SRHxi/3



    Explanation:





    • ^ and $: the string has to start and end with the given regex


    • (?:BE)?: look for a group with BE but ? means it matches zero or
      one times - ?: means find but don't capture


    • s?: look for a space or dot that matches zero or one times


    • [0-1]?: check if a zero of one is present zero or one times


    • (d{3}): Check if succeeded by three digits


    • [.s]?: match a dot or a space zero or one times


    • (d{3}): Check if succeeded by three digits


    • [.s]?: again match a dot or a space zero or one times


    • (d{3}): check for last three digits


    This will check if the input validates.



    Editing it into the code version is simple:



    «code».replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3");


    the g or global modifier will ensure all unwanted characters will be deleted. Here some magic happens. Since the three digits groups are surrounded by parenthesis the form a group. The (?:BE) does look for that group but doesn't capture it. We can put the groups back using the variables $1 to $3.






    document.querySelector("pre").textContent.split("n").forEach(function(element){
    if (element.match(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/))
    {
    console.log(element.replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3"));
    }
    else
    {
    console.log(`REJECTED: ${element}`);
    }

    });

    <pre>
    BE 0123.321.123
    BE0123.321.123
    BE0123 321 123
    BE 01 23 32 11 23
    BE 0123 32 11 23
    1123.321.123
    123.321.123
    123321123
    </pre>





    Rebuilding the String into the correct user friendly way is easy now:






    document.querySelector("pre").textContent.split("n").forEach(function(element) {
    if (element.match(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/)) {
    var stripped = element.replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3");

    //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(humanReadable);
    }
    }

    });

    <pre>
    BE 0123.321.123
    BE0123.321.123
    BE0123 321 123
    0123.321.123
    123.321.123
    123321123
    </pre>







    Second Question
    Yes, this can be done however it requires you to write your own code for it.



    Simple version:






    document.querySelector("div.enterprisenumber > input").addEventListener("keydown", function(e) {
    let value = this.value;

    //prevent the input from going back to 0
    if ( (value.length == 1 && (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.substring(1);
    //calculate how much iterations we need of a groups of three digits.
    const i = Math.floor(valueWithout.length / 3);
    let newValue = "0";
    //check if backspace or delete are used to make sure the dot can be deleted.
    if (valueWithout.length < 10 && !(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{3})[.s]?(d{3})[.s]?(d{3})$/))
    {
    const value = this.value.substring(1).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");
    });

    * {
    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 auto;
    }

    div.enterprisenumber.error {
    border: 1px solid #ff0000;
    }

    div.enterprisenumber>span {
    grid-column: 1;
    border: 0px;
    padding: 3px;
    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;
    }

    div.enterprisenumber>input {
    grid-column: 2;
    border: 0px;
    padding: 3px;
    }

    <div class="enterprisenumber">
    <span>BE</span><input value="0" maxlength="12" />
    </div>








    document.querySelector("pre").textContent.split("n").forEach(function(element){
    if (element.match(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/))
    {
    console.log(element.replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3"));
    }
    else
    {
    console.log(`REJECTED: ${element}`);
    }

    });

    <pre>
    BE 0123.321.123
    BE0123.321.123
    BE0123 321 123
    BE 01 23 32 11 23
    BE 0123 32 11 23
    1123.321.123
    123.321.123
    123321123
    </pre>





    document.querySelector("pre").textContent.split("n").forEach(function(element){
    if (element.match(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/))
    {
    console.log(element.replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3"));
    }
    else
    {
    console.log(`REJECTED: ${element}`);
    }

    });

    <pre>
    BE 0123.321.123
    BE0123.321.123
    BE0123 321 123
    BE 01 23 32 11 23
    BE 0123 32 11 23
    1123.321.123
    123.321.123
    123321123
    </pre>





    document.querySelector("pre").textContent.split("n").forEach(function(element) {
    if (element.match(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/)) {
    var stripped = element.replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3");

    //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(humanReadable);
    }
    }

    });

    <pre>
    BE 0123.321.123
    BE0123.321.123
    BE0123 321 123
    0123.321.123
    123.321.123
    123321123
    </pre>





    document.querySelector("pre").textContent.split("n").forEach(function(element) {
    if (element.match(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/)) {
    var stripped = element.replace(/^(?:BE)?s?[0-1]?(d{3})[.s]?(d{3})[.s]?(d{3})$/g, "$1$2$3");

    //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(humanReadable);
    }
    }

    });

    <pre>
    BE 0123.321.123
    BE0123.321.123
    BE0123 321 123
    0123.321.123
    123.321.123
    123321123
    </pre>





    document.querySelector("div.enterprisenumber > input").addEventListener("keydown", function(e) {
    let value = this.value;

    //prevent the input from going back to 0
    if ( (value.length == 1 && (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.substring(1);
    //calculate how much iterations we need of a groups of three digits.
    const i = Math.floor(valueWithout.length / 3);
    let newValue = "0";
    //check if backspace or delete are used to make sure the dot can be deleted.
    if (valueWithout.length < 10 && !(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{3})[.s]?(d{3})[.s]?(d{3})$/))
    {
    const value = this.value.substring(1).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");
    });

    * {
    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 auto;
    }

    div.enterprisenumber.error {
    border: 1px solid #ff0000;
    }

    div.enterprisenumber>span {
    grid-column: 1;
    border: 0px;
    padding: 3px;
    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;
    }

    div.enterprisenumber>input {
    grid-column: 2;
    border: 0px;
    padding: 3px;
    }

    <div class="enterprisenumber">
    <span>BE</span><input value="0" maxlength="12" />
    </div>





    document.querySelector("div.enterprisenumber > input").addEventListener("keydown", function(e) {
    let value = this.value;

    //prevent the input from going back to 0
    if ( (value.length == 1 && (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.substring(1);
    //calculate how much iterations we need of a groups of three digits.
    const i = Math.floor(valueWithout.length / 3);
    let newValue = "0";
    //check if backspace or delete are used to make sure the dot can be deleted.
    if (valueWithout.length < 10 && !(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{3})[.s]?(d{3})[.s]?(d{3})$/))
    {
    const value = this.value.substring(1).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");
    });

    * {
    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 auto;
    }

    div.enterprisenumber.error {
    border: 1px solid #ff0000;
    }

    div.enterprisenumber>span {
    grid-column: 1;
    border: 0px;
    padding: 3px;
    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;
    }

    div.enterprisenumber>input {
    grid-column: 2;
    border: 0px;
    padding: 3px;
    }

    <div class="enterprisenumber">
    <span>BE</span><input value="0" maxlength="12" />
    </div>






    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited 2 mins ago

























    answered 3 hours ago









    MouserMouser

    11.5k21948




    11.5k21948













    • Wow! Thanks for the explanation. I like the solution. However the modulo test is gone to check if the number is valid (The first 7 digits without the 0 or 1 in front, %97 should be the last two digits).

      – Thore
      1 hour ago











    • that's not that difficult, but not doable in the regexp though.

      – Mouser
      58 mins ago











    • Would you suggest to do it separately? First the regex and then another check for the validation of the number parseInt(97 - (enterpriseNumber.slice(0, 7) % 97), 10) !== parseInt(enterpriseNumber.slice(7, 9), 10

      – Thore
      22 mins ago






    • 1





      See the solutions posted in my answer. Modulo check should be done separately.

      – Mouser
      21 mins ago













    • One last thing. I didn't come up with these examples in my code but something like BE 01 23 32 11 23 or a group separated with more than one space will return false?

      – Thore
      12 mins ago



















    • Wow! Thanks for the explanation. I like the solution. However the modulo test is gone to check if the number is valid (The first 7 digits without the 0 or 1 in front, %97 should be the last two digits).

      – Thore
      1 hour ago











    • that's not that difficult, but not doable in the regexp though.

      – Mouser
      58 mins ago











    • Would you suggest to do it separately? First the regex and then another check for the validation of the number parseInt(97 - (enterpriseNumber.slice(0, 7) % 97), 10) !== parseInt(enterpriseNumber.slice(7, 9), 10

      – Thore
      22 mins ago






    • 1





      See the solutions posted in my answer. Modulo check should be done separately.

      – Mouser
      21 mins ago













    • One last thing. I didn't come up with these examples in my code but something like BE 01 23 32 11 23 or a group separated with more than one space will return false?

      – Thore
      12 mins ago

















    Wow! Thanks for the explanation. I like the solution. However the modulo test is gone to check if the number is valid (The first 7 digits without the 0 or 1 in front, %97 should be the last two digits).

    – Thore
    1 hour ago





    Wow! Thanks for the explanation. I like the solution. However the modulo test is gone to check if the number is valid (The first 7 digits without the 0 or 1 in front, %97 should be the last two digits).

    – Thore
    1 hour ago













    that's not that difficult, but not doable in the regexp though.

    – Mouser
    58 mins ago





    that's not that difficult, but not doable in the regexp though.

    – Mouser
    58 mins ago













    Would you suggest to do it separately? First the regex and then another check for the validation of the number parseInt(97 - (enterpriseNumber.slice(0, 7) % 97), 10) !== parseInt(enterpriseNumber.slice(7, 9), 10

    – Thore
    22 mins ago





    Would you suggest to do it separately? First the regex and then another check for the validation of the number parseInt(97 - (enterpriseNumber.slice(0, 7) % 97), 10) !== parseInt(enterpriseNumber.slice(7, 9), 10

    – Thore
    22 mins ago




    1




    1





    See the solutions posted in my answer. Modulo check should be done separately.

    – Mouser
    21 mins ago







    See the solutions posted in my answer. Modulo check should be done separately.

    – Mouser
    21 mins ago















    One last thing. I didn't come up with these examples in my code but something like BE 01 23 32 11 23 or a group separated with more than one space will return false?

    – Thore
    12 mins ago





    One last thing. I didn't come up with these examples in my code but something like BE 01 23 32 11 23 or a group separated with more than one space will return false?

    – Thore
    12 mins ago













    2














    For your example strings, you could match:



    ^(?:BEs?)?[01]?(d{3}([. ])d{3}2d{3}|d{9})$


    That will match





    • ^ Start of string


    • (?:BEs?)? Optional BE followed by optional whitespace char


    • [01]? Optional zero or 1


    • ( Capturing group



      • d{3} Match 3 digits


      • ([. ]) Capture in group either a space or digit to use as backreference


      • d{3}2d{3} Match 3 digits, dot or space (2 is the backreference) and 3 digits


      • | Or


      • d{9} Match 9 digits




    • ) Close capturing group


    • $ End of string


    Regex demo



    And then in the replacement use the first capturing group and replace the space or the dot with an empty string.






    let pattern = /^(?:BEs?)?[01]?(d{3}([. ])d{3}2d{3}|d{9})$/;
    let strings = [
    "BE 0123.321.123",
    "BE0123.321.123",
    "BE0123 321 123",
    "0123.321.123",
    "123.321.123",
    "123321123",
    ];

    strings = strings.map(x => x.replace(pattern, function(m, g) {
    let enterpriseNumber = g.replace(/[. ]/g, "");
    return `BE 0${enterpriseNumber.substring(0, 3)}.${enterpriseNumber.substring(3, 6)}.${enterpriseNumber.substring(6, 9)}`
    }));

    console.log(strings);








    share|improve this answer






























      2














      For your example strings, you could match:



      ^(?:BEs?)?[01]?(d{3}([. ])d{3}2d{3}|d{9})$


      That will match





      • ^ Start of string


      • (?:BEs?)? Optional BE followed by optional whitespace char


      • [01]? Optional zero or 1


      • ( Capturing group



        • d{3} Match 3 digits


        • ([. ]) Capture in group either a space or digit to use as backreference


        • d{3}2d{3} Match 3 digits, dot or space (2 is the backreference) and 3 digits


        • | Or


        • d{9} Match 9 digits




      • ) Close capturing group


      • $ End of string


      Regex demo



      And then in the replacement use the first capturing group and replace the space or the dot with an empty string.






      let pattern = /^(?:BEs?)?[01]?(d{3}([. ])d{3}2d{3}|d{9})$/;
      let strings = [
      "BE 0123.321.123",
      "BE0123.321.123",
      "BE0123 321 123",
      "0123.321.123",
      "123.321.123",
      "123321123",
      ];

      strings = strings.map(x => x.replace(pattern, function(m, g) {
      let enterpriseNumber = g.replace(/[. ]/g, "");
      return `BE 0${enterpriseNumber.substring(0, 3)}.${enterpriseNumber.substring(3, 6)}.${enterpriseNumber.substring(6, 9)}`
      }));

      console.log(strings);








      share|improve this answer




























        2












        2








        2







        For your example strings, you could match:



        ^(?:BEs?)?[01]?(d{3}([. ])d{3}2d{3}|d{9})$


        That will match





        • ^ Start of string


        • (?:BEs?)? Optional BE followed by optional whitespace char


        • [01]? Optional zero or 1


        • ( Capturing group



          • d{3} Match 3 digits


          • ([. ]) Capture in group either a space or digit to use as backreference


          • d{3}2d{3} Match 3 digits, dot or space (2 is the backreference) and 3 digits


          • | Or


          • d{9} Match 9 digits




        • ) Close capturing group


        • $ End of string


        Regex demo



        And then in the replacement use the first capturing group and replace the space or the dot with an empty string.






        let pattern = /^(?:BEs?)?[01]?(d{3}([. ])d{3}2d{3}|d{9})$/;
        let strings = [
        "BE 0123.321.123",
        "BE0123.321.123",
        "BE0123 321 123",
        "0123.321.123",
        "123.321.123",
        "123321123",
        ];

        strings = strings.map(x => x.replace(pattern, function(m, g) {
        let enterpriseNumber = g.replace(/[. ]/g, "");
        return `BE 0${enterpriseNumber.substring(0, 3)}.${enterpriseNumber.substring(3, 6)}.${enterpriseNumber.substring(6, 9)}`
        }));

        console.log(strings);








        share|improve this answer















        For your example strings, you could match:



        ^(?:BEs?)?[01]?(d{3}([. ])d{3}2d{3}|d{9})$


        That will match





        • ^ Start of string


        • (?:BEs?)? Optional BE followed by optional whitespace char


        • [01]? Optional zero or 1


        • ( Capturing group



          • d{3} Match 3 digits


          • ([. ]) Capture in group either a space or digit to use as backreference


          • d{3}2d{3} Match 3 digits, dot or space (2 is the backreference) and 3 digits


          • | Or


          • d{9} Match 9 digits




        • ) Close capturing group


        • $ End of string


        Regex demo



        And then in the replacement use the first capturing group and replace the space or the dot with an empty string.






        let pattern = /^(?:BEs?)?[01]?(d{3}([. ])d{3}2d{3}|d{9})$/;
        let strings = [
        "BE 0123.321.123",
        "BE0123.321.123",
        "BE0123 321 123",
        "0123.321.123",
        "123.321.123",
        "123321123",
        ];

        strings = strings.map(x => x.replace(pattern, function(m, g) {
        let enterpriseNumber = g.replace(/[. ]/g, "");
        return `BE 0${enterpriseNumber.substring(0, 3)}.${enterpriseNumber.substring(3, 6)}.${enterpriseNumber.substring(6, 9)}`
        }));

        console.log(strings);








        let pattern = /^(?:BEs?)?[01]?(d{3}([. ])d{3}2d{3}|d{9})$/;
        let strings = [
        "BE 0123.321.123",
        "BE0123.321.123",
        "BE0123 321 123",
        "0123.321.123",
        "123.321.123",
        "123321123",
        ];

        strings = strings.map(x => x.replace(pattern, function(m, g) {
        let enterpriseNumber = g.replace(/[. ]/g, "");
        return `BE 0${enterpriseNumber.substring(0, 3)}.${enterpriseNumber.substring(3, 6)}.${enterpriseNumber.substring(6, 9)}`
        }));

        console.log(strings);





        let pattern = /^(?:BEs?)?[01]?(d{3}([. ])d{3}2d{3}|d{9})$/;
        let strings = [
        "BE 0123.321.123",
        "BE0123.321.123",
        "BE0123 321 123",
        "0123.321.123",
        "123.321.123",
        "123321123",
        ];

        strings = strings.map(x => x.replace(pattern, function(m, g) {
        let enterpriseNumber = g.replace(/[. ]/g, "");
        return `BE 0${enterpriseNumber.substring(0, 3)}.${enterpriseNumber.substring(3, 6)}.${enterpriseNumber.substring(6, 9)}`
        }));

        console.log(strings);






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 1 hour ago

























        answered 3 hours ago









        The fourth birdThe fourth bird

        23.8k81429




        23.8k81429























            1














            Here is an implementation of a BE ____.___.___ style of input. The pattern will be maintained, so the input will be guaranteed to have the "BE" prefix, the space, and the two dots. The validation can then concentrate on completeness and the modulo test.



            Note that the input requires the first group to have 4 digits, where the first digit must be a 0 or a 1.






            const ent = document.getElementById("ent");
            const out = document.getElementById("isvalid");

            function format() {
            const re = /^D*[2-9]+|D+/g;
            const [i, j] = [this.selectionStart, this.selectionEnd].map(i => {
            i = this.value.slice(0, i).replace(re, "").length;
            return i + 3 + (i >= 4 + format.backspace) + (i >= 7 + format.backspace);
            });
            this.value = "BE " + this.value.replace(re, "").padEnd(10, "_")
            .replace(/(....)(...)(...).*/, "$1.$2.$3");
            this.setSelectionRange(i, j);
            format.backspace = false;
            out.textContent = validate(this.value) ? "is valid" : "is invalid";
            }

            function validate(num) {
            return /^BE [01](d{3}.){2}d{3}$/.test(num)
            && 97 - num.replace(/D/g, "").slice(0, 8) % 97 === +num.slice(-2);
            }

            ent.addEventListener("input", format);
            ent.addEventListener("keydown", (e) => format.backspace = e.key == "Backspace");

            Belgian enterprise number: <input id="ent" value="BE ____.___.___">
            <span id="isvalid"></span>








            share|improve this answer
























            • Wow, that's a nice solution to the second question.

              – Mouser
              20 mins ago
















            1














            Here is an implementation of a BE ____.___.___ style of input. The pattern will be maintained, so the input will be guaranteed to have the "BE" prefix, the space, and the two dots. The validation can then concentrate on completeness and the modulo test.



            Note that the input requires the first group to have 4 digits, where the first digit must be a 0 or a 1.






            const ent = document.getElementById("ent");
            const out = document.getElementById("isvalid");

            function format() {
            const re = /^D*[2-9]+|D+/g;
            const [i, j] = [this.selectionStart, this.selectionEnd].map(i => {
            i = this.value.slice(0, i).replace(re, "").length;
            return i + 3 + (i >= 4 + format.backspace) + (i >= 7 + format.backspace);
            });
            this.value = "BE " + this.value.replace(re, "").padEnd(10, "_")
            .replace(/(....)(...)(...).*/, "$1.$2.$3");
            this.setSelectionRange(i, j);
            format.backspace = false;
            out.textContent = validate(this.value) ? "is valid" : "is invalid";
            }

            function validate(num) {
            return /^BE [01](d{3}.){2}d{3}$/.test(num)
            && 97 - num.replace(/D/g, "").slice(0, 8) % 97 === +num.slice(-2);
            }

            ent.addEventListener("input", format);
            ent.addEventListener("keydown", (e) => format.backspace = e.key == "Backspace");

            Belgian enterprise number: <input id="ent" value="BE ____.___.___">
            <span id="isvalid"></span>








            share|improve this answer
























            • Wow, that's a nice solution to the second question.

              – Mouser
              20 mins ago














            1












            1








            1







            Here is an implementation of a BE ____.___.___ style of input. The pattern will be maintained, so the input will be guaranteed to have the "BE" prefix, the space, and the two dots. The validation can then concentrate on completeness and the modulo test.



            Note that the input requires the first group to have 4 digits, where the first digit must be a 0 or a 1.






            const ent = document.getElementById("ent");
            const out = document.getElementById("isvalid");

            function format() {
            const re = /^D*[2-9]+|D+/g;
            const [i, j] = [this.selectionStart, this.selectionEnd].map(i => {
            i = this.value.slice(0, i).replace(re, "").length;
            return i + 3 + (i >= 4 + format.backspace) + (i >= 7 + format.backspace);
            });
            this.value = "BE " + this.value.replace(re, "").padEnd(10, "_")
            .replace(/(....)(...)(...).*/, "$1.$2.$3");
            this.setSelectionRange(i, j);
            format.backspace = false;
            out.textContent = validate(this.value) ? "is valid" : "is invalid";
            }

            function validate(num) {
            return /^BE [01](d{3}.){2}d{3}$/.test(num)
            && 97 - num.replace(/D/g, "").slice(0, 8) % 97 === +num.slice(-2);
            }

            ent.addEventListener("input", format);
            ent.addEventListener("keydown", (e) => format.backspace = e.key == "Backspace");

            Belgian enterprise number: <input id="ent" value="BE ____.___.___">
            <span id="isvalid"></span>








            share|improve this answer













            Here is an implementation of a BE ____.___.___ style of input. The pattern will be maintained, so the input will be guaranteed to have the "BE" prefix, the space, and the two dots. The validation can then concentrate on completeness and the modulo test.



            Note that the input requires the first group to have 4 digits, where the first digit must be a 0 or a 1.






            const ent = document.getElementById("ent");
            const out = document.getElementById("isvalid");

            function format() {
            const re = /^D*[2-9]+|D+/g;
            const [i, j] = [this.selectionStart, this.selectionEnd].map(i => {
            i = this.value.slice(0, i).replace(re, "").length;
            return i + 3 + (i >= 4 + format.backspace) + (i >= 7 + format.backspace);
            });
            this.value = "BE " + this.value.replace(re, "").padEnd(10, "_")
            .replace(/(....)(...)(...).*/, "$1.$2.$3");
            this.setSelectionRange(i, j);
            format.backspace = false;
            out.textContent = validate(this.value) ? "is valid" : "is invalid";
            }

            function validate(num) {
            return /^BE [01](d{3}.){2}d{3}$/.test(num)
            && 97 - num.replace(/D/g, "").slice(0, 8) % 97 === +num.slice(-2);
            }

            ent.addEventListener("input", format);
            ent.addEventListener("keydown", (e) => format.backspace = e.key == "Backspace");

            Belgian enterprise number: <input id="ent" value="BE ____.___.___">
            <span id="isvalid"></span>








            const ent = document.getElementById("ent");
            const out = document.getElementById("isvalid");

            function format() {
            const re = /^D*[2-9]+|D+/g;
            const [i, j] = [this.selectionStart, this.selectionEnd].map(i => {
            i = this.value.slice(0, i).replace(re, "").length;
            return i + 3 + (i >= 4 + format.backspace) + (i >= 7 + format.backspace);
            });
            this.value = "BE " + this.value.replace(re, "").padEnd(10, "_")
            .replace(/(....)(...)(...).*/, "$1.$2.$3");
            this.setSelectionRange(i, j);
            format.backspace = false;
            out.textContent = validate(this.value) ? "is valid" : "is invalid";
            }

            function validate(num) {
            return /^BE [01](d{3}.){2}d{3}$/.test(num)
            && 97 - num.replace(/D/g, "").slice(0, 8) % 97 === +num.slice(-2);
            }

            ent.addEventListener("input", format);
            ent.addEventListener("keydown", (e) => format.backspace = e.key == "Backspace");

            Belgian enterprise number: <input id="ent" value="BE ____.___.___">
            <span id="isvalid"></span>





            const ent = document.getElementById("ent");
            const out = document.getElementById("isvalid");

            function format() {
            const re = /^D*[2-9]+|D+/g;
            const [i, j] = [this.selectionStart, this.selectionEnd].map(i => {
            i = this.value.slice(0, i).replace(re, "").length;
            return i + 3 + (i >= 4 + format.backspace) + (i >= 7 + format.backspace);
            });
            this.value = "BE " + this.value.replace(re, "").padEnd(10, "_")
            .replace(/(....)(...)(...).*/, "$1.$2.$3");
            this.setSelectionRange(i, j);
            format.backspace = false;
            out.textContent = validate(this.value) ? "is valid" : "is invalid";
            }

            function validate(num) {
            return /^BE [01](d{3}.){2}d{3}$/.test(num)
            && 97 - num.replace(/D/g, "").slice(0, 8) % 97 === +num.slice(-2);
            }

            ent.addEventListener("input", format);
            ent.addEventListener("keydown", (e) => format.backspace = e.key == "Backspace");

            Belgian enterprise number: <input id="ent" value="BE ____.___.___">
            <span id="isvalid"></span>






            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered 41 mins ago









            trincottrincot

            126k1688122




            126k1688122













            • Wow, that's a nice solution to the second question.

              – Mouser
              20 mins ago



















            • Wow, that's a nice solution to the second question.

              – Mouser
              20 mins ago

















            Wow, that's a nice solution to the second question.

            – Mouser
            20 mins ago





            Wow, that's a nice solution to the second question.

            – Mouser
            20 mins ago


















            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54990565%2fcan-this-function-be-rewritten-with-a-regex%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Webac Holding Inhaltsverzeichnis Geschichte | Organisationsstruktur | Tochterfirmen |...

            What's the meaning of a knight fighting a snail in medieval book illustrations?What is the meaning of a glove...

            Salamanca Inhaltsverzeichnis Lage und Klima | Bevölkerungsentwicklung | Geschichte | Kultur und...