If you can post a post that is causing the problem (possibly anonymous in some way), this will give us more information, but I think the problem is this little man right here:
([-.]\\w+)*\\.\\w+([-.]\\w+)*
To understand the problem, divide it into groups:
([-.]\\w+)* \\.\\w+ ([-.]\\w+)*
Lines that match \\.\\w+ are a subset of those that match [-.]\\w+ . Therefore, if part of your input looks like foo.bar.baz.blah.yadda.com , your regex engine does not know which group should match it. Does this make sense? Thus, the first ([-.]\\w+)* could correspond to .bar.baz.blah , then \\.\\w+ could correspond to .yadda , then the last ([-.]\\w+)* could would match .com ...
... OR the first sentence can match .bar.baz , the second can match .blah , and the last can match .yadda.com . Since he does not know which one is right, he will continue to try to use different combinations. In the end, it should stop, but it can take a long time. This is called a "catastrophic return."
This problem is compounded by the fact that you are using capture groups, not non-capture groups; those. ([-+.]\\w+) instead of (?:[-+.]\\w+) . This makes the engine try and split and save any matches inside parentheses for later reference. But, as I explained above, it is ambiguous which group each substring belongs to.
You can consider replacing everything after @ as follows:
\\w[-\\w]*\\.[-.\\w]+
This may use some refinements to make it more specific, but you get a general idea. I hope I have explained all this well enough; grouping and backlinks are pretty hard to describe.
EDIT:
Looking back at your sample, there is a deeper problem here that is still related to the return / ambiguity problem that I mentioned. The sentence \\w+([-.]\\w+)* is ambiguous in itself. Breaking it into parts, we have:
\\w+ ([-.]\\w+)*
Suppose you have a string of type foobar . Where does the end of \\w+ and ([-.]\\w+)* begin? How many repetitions ([-.]\\w+) are there? Any of the following may work as a match:
f(oobar) foo(bar) f(o)(oba)(r) f(o)(o)(b)(a)(r) foobar etc...
The regex engine does not know what is important, so it will try all of them. This is the same problem that I mentioned above, but it means that you have it in several places in your template.
Worse, ([-.]\\w+)* also ambiguous, due to + after \\w . How many groups are there in blah ? I count 16 possible combinations: (blah) , (b)(lah) , (bl)(ah) ...
The number of different possible combinations will be huge, even for relatively small input, so your engine will be in overdrive. I would definitely simplify this if I were you.