How regular expression OR operator is evaluated
If you are interested in what happens when you use |
alternation operator, the answer is easy: the regex engine processes the expression and the input string from left to right.
Taking the pattern you have as an example, ^.{8}|.{12}$|.{4}
starts inspecting the input string from the left, and checks for ^.{8}
- first 8 characters. Finds them and it is a match. Then, goes on and finds the last 12 characters with .{12}$
, and again there is a match. Then, any 4-character strings are matched.
Debuggex Demo
Next, you have ^.{8}|.{4}|.{12}$
. The expression is again parsed from left to right, first 8 characters are matched first, but next, only 4-character sequences will be matched, .{12}
won't ever fire because there will be .{4}
matches!
Debuggex Demo
Your Regex ^.{8}|.{12}$|.{4}
evaluates to:
Starting with any character except \n { Exactly 8 times }
OR any character except \n { Exactly 12 times }
OR any character except \n { Exactly 4 times } globally
This means that anything after 4 characters in a row will be matched because somewhere in a string of >4 characters there are 4 characters in a row.
1 [false]
12 [false]
123 [false]
1234 [true]
12345 [true]
123456 [true]
1234567 [true]
12345678 [true]
123456789 [true]
1234567890 [true]
12345678901 [true]
123456789012 [true]
You might be looking for:
^.{8}$|^.{12}$|^.{4}$
Which gives you:
1 [false]
12 [false]
123 [false]
1234 [true]
12345 [false]
123456 [false]
1234567 [false]
12345678 [true]
123456789 [false]
1234567890 [false]
12345678901 [false]
123456789012 [true]