You could use perl:
perl -pe 's/[\d+-]+/eval$&/ge' your-file
Or even:
perl -pe 's/[\d+-]+/$&/gee' your-file (thanks Rakesh)
Same with zsh:
set -o extendedglob # for the ## operator (same as ERE +)
while IFS= read -r line; do
printf '%s\n' ${line//(#m)[0-9+-]##/$((MATCH))}
done < your-file
Or:
zmodload zsh/mapfile
set -o extendedglob
printf %s ${mapfile[your-file]//(#m)[0-9+-]##/$((MATCH))}
In all threefour, we're looking for sequences of digits, - and + characters and passing them to the interpreter's arithmetic processor (eval in perl (or the ee flag that causes the expansion of the replacement to be evaluated as perl code), $((...)) in zsh).
We're not validating the expressions before passing to the interpreter, so it may cause failures (for instance on sequences like -+- or 3++) but at least, because we're only considering digits and -/+ characters, it shouldn't do much more harm than reporting an error message and aborting the command.