Search code examples
javascriptangularjsregexangularjs-ng-pattern

Regular expression : match either of two conditions?


Hi I don't know much about regular expression. But I need it in form validation using angularJs.

Below is the requirement

The input box should accept only if either

(1) first 2 letters alpha + 6 numeric

or

(2) 8 numeric

Below are some correct Inputs :-

(1)SH123456 (2)12345678 (3)sd456565

I tried data-ng-pattern="/(^([a-zA-Z]){2}([0-9]){6})|([0-9]*)?$/" , Its working fine for both the above condition but still it is accepting strings like S2D3E4F5 and may be many other combination as well.

What I am doing wrong I am not able to find it out.

Any help is appreciable !!!

Thanks


Solution

  • In your regex, the two alternative branches are anchored separately:

    • (^([a-zA-Z]){2}([0-9]){6}) - 2 letters and 6 digits at the start of the string
    • | - or
    • ([0-9]*)?$ - optional zero or more digits at the end of the string

    You need to adjust the boundaries of the group:

    data-ng-pattern="/^([a-zA-Z]{2}[0-9]{6}|[0-9]{8})?$/"
                       ^                         ^^^^ 
    

    See the regex demo.

    Now, the pattern will match:

    • ^ - start of string
    • ( - start of the grouping:
      • [a-zA-Z]{2}[0-9]{6} - 2 letters and 6 digits
      • | - or
      • [0-9]{8} - 8 digits
    • )? - end of the grouping and ? quantifier makes it match 1 or 0 times (optional)
    • $ - end of string.