RegEx Validation for Specific Easily Guessed Patterns

前端 未结 1 1273
谎友^
谎友^ 2021-01-25 03:48

So I am completely not knowing in where to start in creating a RegEx validation pattern in my React application.

I have various input boxes, of which (depending on c

相关标签:
1条回答
  • 2021-01-25 04:03

    As in my comment below your question, you can use the following regex:

    See regex in use here

    ^(?!9+[98]$|\d1{2})\d{3,6}$
    

    How it works:

    • ^ assert position at the start of the line
    • (?!9+[98]$|\d1{2}) negative lookahead ensuring either of the the following options does not proceed
      • 9+[98]$ matches 9 one or more times, then either 9 or 8, then the end of the line
      • \d1{2}) matches any digit, followed by 1 twice
    • \d{3,6} matches between 3 and 6 digits
    • $ assert position at the end of the line

    Since the negative lookahead follows the start of line anchor, we also ensure the lookahead starts at that position, that's why \d1{2} matches 011, 111, 211, ..., 911 and not 1211 or others.

    Code below:

    s = ['999','998','911','611','9999','9998','8112','5112','99999','99998','71122','41122','999999','999998','611222','311222','123','6211','99989','121212']
    r = /^(?!9+[98]$|\d1{2})\d{3,6}$/
    for (x of s) {
      console.log(x.match(r) ? x + ': true' : x + ': false')
    }

    --

    Edit

    The OP mentioned that 999 and 998 placed anywhere in the string should invalidate it:

    See regex in use here

    ^(?!\d*9{2}[98]|\d1{2})\d{3,6}$
    

    Same regex as above except for the first option in the negative lookahead. It's now \d*9{2}[98], matching 999 or 998 anywhere in the string (preceded by any number of digits).

    s = ['999','998','911','611','9999','9998','8112','5112','99999','99998','71122','41122','999999','999998','611222','311222','123','6211','99989','121212']
    r = /^(?!\d*9{2}[98]|\d1{2})\d{3,6}$/
    for (x of s) {
      console.log(x.match(r) ? x + ': true' : x + ': false')
    }

    --

    Edit #2

    The OP mentioned that the format of 0N11 should be invalidated (not just N11):

    See regex in use here

    ^(?!\d*9{2}[98]|[01]?\d1{2})\d{3,6}$
    

    Same regex as above except for the second option in the negative lookahead. It's now [01]?\d1{2}, matching 0 or 1 optionally, followed by any digit, then 11 (so 011, 111, 211, ..., 911, 0011, 0111, 0211, 0311, ..., 0911, 1011, 1111, 1211, ..., 1911).

    s = ['999','998','911','611','9999','9998','8112','5112','99999','99998','71122','41122','999999','999998','611222','311222','123','6211','99989','121212']
    r = /^(?!\d*9{2}[98]|[01]?\d1{2})\d{3,6}$/
    for (x of s) {
      console.log(x.match(r) ? x + ': true' : x + ': false')
    }

    0 讨论(0)
提交回复
热议问题