My standard approach to this is a pattern such as:
-(?!((?!</?a\b).)*</a)
with whatever you want as the replacement string.
You can set the "singleline" option depending on your circumstances - ditto the "ignore case" option if the "a" tag can possibly be in upper case.
What this does is to locate a "-" character and then start looking forward for either a "<a..." or "</a" sequence (or the end of the line). If there is a match on the "</a" then we must be somewhere after the start of the opening "<a..." tag (assuming the tags are correctly balanced within the line/string you are parsing) and so we don't accept the match. If it is anything else (the "<a..." or end of line/string situations) then we must be outside the paired tags and so the match is accepted.
Because this is only matching on the "-" itself (the rest of the pattern is a lookahead), it will make the replacement and then move on to look for any subsequent "-" (assuming the replace operation looks for all matches)
Also watch out for the '.+' parts of your pattern. It will actually match the first "<a..." with the last "<a>" in the string. What happens is that the "<a" text is matched (BTW this will match "<arrow" and "<aardvark" and any other 'tag' that begins with "<a" - generally you should do what I've done to limit the tag name with the '\b' anchor) and then the '.+' will match all characters from there to the end of the line/string before it tries to match whatever else may follow. In this case it is the ">" character and so it will start backtracking (which means releasing one of the characters it has previously matched with the '.+') until it either gets to the last character (in which case that part of the match is declared a "fail") or the ">" character has been released and so matches. Unfortunately this means that you are matching the FIRST "<a" with the LAST ">", even if there are many "<a>...</a>" sequences in between.
In your case, the pattern will then use the '(.+)' part to again grab everything to the end of the line/string before it looks for the "</a>" sequence. Again this starts the backtracking process but, because we previously matched the "<a" at the start with the ">" of the "</a>" at the end, the backtracking will run out of characters before it can find a subsequent match. Therefore it will go back to the previous '.+' in the '<a.+>' part and release a single character form there. This will allow the '(.+)' part to again grab everything to the end of the line/string and we start this part of the backtracking again.
I'm sure you can see that this can lead to a LOT of work (in some cases this can lead to what appears to be an infinite loop) by the regex engine, especially if you are scanning a large block of text (say a web page!).
One way around this is to stop the '+' (or '*') quantifier from being greedy by using the '+?' quantifier. This makes the regex engine match one character and then see if the following part of the pattern will match. If it doesn't then it will match another character and try again. In this way it moves forward (albeit slowly) and so matches the beginning characters with the NEXT matching end characters.
Susan