The Regex class itself is thread-safe and immutable. That is, Regex objects can be created on any thread and shared between threads; matching methods can be called from any thread and never alter any global state.
However, result objects (Match and MatchCollection) returned by Regex should be used on a single thread. Although many of these objects are logically immutable, their implementations may delay computation of some results to improve performance, and as a result, callers must serialize access to them.
If there is a need to share Regex result objects on multiple threads, these objects can be converted to thread-safe instances by calling their synchronized methods. With the exception of enumerators, all classes in this specification are thread-safe or can be converted to thread-safe objects by a synchronized method.
Enumerators are the only exception. An application is responsible for serializing calls to collection enumerators itself. Here is the rule: if a collection can be enumerated on more than one thread simultaneously, use of enumerator methods should be synchronized on the root object of the collection traversed by the enumerator.