Korzystanie z przemian i konstruowania grup

Pierwotnie chciałem mieć numer miesiąca parsowania wyrażenia regularnego. Na początku wymyśliłem następujące wyrażenie regularne:

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

i pasowało do dowolnej liczby dodatniej, mówiąc, że pasuje do cyfry wysokiego rzędu liczby, tj .:

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

Dlaczego to jest takie? Myślałem, że konstrukcja alternatywna się sprawdziRegex wybierz lewy lub prawy, mając^ i& sprawia, że ​​pasuje do całego ciągu. czego mi brakuje?

P.S: Mam teraz działający regex (taki, który pasuje tylko do liczb od 1 do 12); jego:

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

I nie mogę zrozumieć, dlaczego tak działa ...

To jest kod, którego użyłem do testowania:

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