There are several things you can do to improve your pattern.
The first is that the pattern you have shown will need a space after the last date digit and before the "team" or "local" key work within the square brackets.
The problem you are getting of matching too much text is due to the use of the '(.+)' construct with the "s" (singleline) option. With the single line option set, '.' will match newline characters as well as the other characters that '.' normally matches . The effect of this is that there is nothing to stop this part of the pattern matching except the end of the text. If you take off the 'singleline' option, then you will correctly match to the end of the "current" line. You then need to add something to your pattern to make it move to the next line and match the numbers in parentheses. Something like:
\n\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\s+\[(?:team|local)\]\s+\[me\]\s+!(.+)
\n\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\s+\[(?:team|local)\]\s+\[\]\s+your\s+(current\s+)?position\sis:\s+
\((\d+),\s+(\d+)\)
(I know this does not account for the "random text 13" case but this is just to show the idea).
If I were doing this, my pattern would be something like:
!(.+)
(\n((?!!).)*$)*?
\n((?!\bposition\b).)*position
\s+is:\s+\((\d+),\s+(\d+)\)
with the "ignore case" and "multiline" options set. (If you split it over several lines like this, then you will also need the "ignore whitespace" or equivalent option set as well). The text you want will be captured in match group #1, and the position values in match groups #5 and #6. From those, you can build the output string you are looking for.
The first line finds the users text. The second line will skip over any lines that do not contain a "!" (such as your "random text 14" line) but possibly skip no lines at all. The 3rd line will only match a line with the keyword "position" in it and the 4th line will then capture the position coordinates.
I must admit that I don't know if the ECMA-262 standard supports some of the constructs I've used such as the lazy quantifiers. Also this is just one way you can approach this situation. I must admit that I probably don't understand your problem space fully and I may not have correctly accounted for everything you may encounter. However it might give you some ideas of how to move forward.
The key thing to remember in constructing a pattern is that you need to account for every possible character that is between the first and the last characters you want to include in the match. Looking at your pattern, you spend quite a bit of effort making sure that the line begins with the date/time stamp etc, where as all you really want to look for is the "!" character. (I might have misunderstood your complete problem here in which case you may need to expand this a bit to ensure - for example - that the "!" that is used for the start of the pattern must be preceded by the "] " sequence etc.).
Once you have started a match, then you must account for every character until you get the the last possible character. In your pattern you have not really told the pattern where to stop - there is nothing to locate the "(xxx,yyy)" position text etc. Also if you do take away the "singleline" option, then there is nothing that will match the additional text lines before the "position" line.
Susan