Существует разница в скорости между двумя и первым:
foreach (Match match in serverNameRegex.Matches(loginPage))
{
....
}
быстрее.
Причина в первом - serverNameRegex.Matches (loginPage) оценивается один раз, и цикл for уже знает о каждом значении совпадения, тогда как в:
MatchCollection matches = serverNameRegex.Matches(loginPage);
foreach (Match match in matches)
{
...
}
цикл должен оценивать коллекцию совпадений на каждой итерации.