Se você estiver interessado no que acontece quando você usa
|
operador de alternância
, a resposta é fácil:o mecanismo regex processa a expressão e a string de entrada da esquerda para direita . Tomando o padrão que você tem como exemplo,
^.{8}|.{12}$|.{4}
começa a inspecionar a string de entrada da esquerda e verifica se há ^.{8}
- primeiros 8 caracteres. Encontra-os e é um jogo. Em seguida, continua e encontra os últimos 12 caracteres com .{12}$
, e novamente há uma correspondência. Em seguida, quaisquer cadeias de 4 caracteres são correspondidas. 
Demonstração do Debuggex
Em seguida, você tem
^.{8}|.{4}|.{12}$
. A expressão é novamente analisada da esquerda para a direita, os primeiros 8 caracteres são correspondidos primeiro, mas em seguida, apenas sequências de 4 caracteres serão correspondidas, .{12}
nunca será acionado porque haverá .{4}
fósforos! 
Demonstração do Debuggex