Regular expression : match either of two conditions?

shreyansh picture shreyansh · Sep 21, 2016 · Viewed 22.5k times · Source

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

Answer

Wiktor Stribiżew picture Wiktor Stribiżew · Sep 21, 2016

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.