Usando construções de alternância e agrupamento

Originalmente, eu queria números de mês de análise regular. No começo eu encontrei o seguinte regex:

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

e correspondia a qualquer número positivo, dizendo que correspondia ao dígito de alta ordem do número, ou seja:

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

Por que? Eu pensei que a construção de alternância fariaRegex escolha a esquerda ou a direita, tendo^ e& faz com que corresponda a toda a cadeia. o que estou perdendo?

P.S .: Eu tenho um regex de trabalho agora (um que combina apenas números de 1 a 12); Está:

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

E eu não entendo porque isso funciona ....

Este é o código que usei para testar:

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");
}

questionAnswers(2)

yourAnswerToTheQuestion