Definitely profile your code before doing any optimization. It's certainly reasonable to make some up-front decisions based on what you think might be optimal code, but once you get reasonable and working code, don't start hacking away at it in the hopes of gaining some sort of optimization. Time it, profile it, etc to find the slow spots, then focus on those.
As for the cost of initialization vs. use with regex objects, I'm not personally familiar with C#'s handling of them, but in Python, there is a cost to creating a regex which goes beyond just initializing a few member variables.
import re
from timeit import Timer
test_str = 'abra, abra, cadabra'
test_re = 'c.d'
def inside(s):
r = re.compile(test_re)
return r.match(s)
r = re.compile(test_re)
def outside(s):
return r.match(s)
print "inside =", Timer("inside(test_str)", "from __main__ import inside, test_str").timeit()
print "outside =", Timer("outside(test_str)", "from __main__ import outside, test_str").timeit()
The output from the little test code above clearly shows that creating the regex inside the function each time it is called is a significant performance loss.
inside = 3.24013303367
outside = 1.45581882614