Вам нужно включить начало и конец якоря строки, иначе он может соответствовать части строки:
^([a-zA-Z0-9]{4}|[a-zA-Z0-9]{8})$
Вот краткий пример использования этого регулярного выражения:
Regex regex = new Regex("^([a-zA-Z0-9]{4}|[a-zA-Z0-9]{8})$");
string[] tests = { "abcd", "0123", "01234567", "012345", "0123456789" };
foreach (string test in tests)
{
Console.WriteLine("{0}: {1}", test.PadRight(10), regex.IsMatch(test));
}
Результат:
abcd : True
0123 : True
01234567 : True
012345 : False
0123456789: False
Альтернативный способ написания регулярного выражения заключается в следующем:
^(?:[a-zA-Z0-9]{4}){1,2}$