Uso de construcciones de alternancia y agrupación.

Originalmente quería un número de meses de análisis de expresiones regulares. Al principio se me ocurrió el siguiente regex:

^([1-9]{1})|(1[012])$

y coincidió con cualquier número positivo, diciendo que coincidía con el dígito de orden superior del número, es decir:

1 => 1
2 => 2
...
9 => 9
10=> 1
...
19=> 1
20=> 2
...

¿Por qué es así? Pensé que la construcción de alternancia haráRegex Elija la izquierda o la derecha, mientras que tiene^ y& hace que coincida con toda la cadena. ¿Qué me estoy perdiendo?

P.S .: Tengo una expresión regular de trabajo ahora (una que coincide con los números del 1 al 12 solamente); sus:

^([1-9]{1}|1[012])$

Y no puedo entender por qué funciona así ...

Este es el código que solía probar:

Regex r = new Regex(@"^([1-9]{1})|(1[012])$");//^([1-9]{1}|1[012])$
for (int i = -5; i < 35; i++)
{
    Console.Write(i);
    Console.Write("\t");
    Match m = r.Match(i.ToString());
    if (m.Success)
        Console.WriteLine(m.Groups[0].Value);
    else
        Console.WriteLine("false");
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta