A complicated regex could solve this, for sure. However, I believe the easiest solution is to take advantage of one of regular expressions most powerful tools, namely greedy matching, and break this into two steps.
s{([-\d]+)}{my $num = $1; $num =~ /^(?:\d+-\d*|-+)$/ ? $num : ''}eg;
The LHS pulls any number and/or dashes. Then the RHS leaves them if they match the specific exception that you requested.
I like the two step solution because it's quicker to see what's happening, and also the regex is less fragile so it's easier to adjust it at a later time with less risk of introducing a bug. All you'd have to do is add any additional exceptions you'd want to the RHS.
It is possible to duplicate the above using just the LHS by adding a lot of boundary conditions that mirror the effect of greedy matching. The below demonstrates that:
s{
(?<![-\d]) # Start Boundary Condition to Enforce Greedy Matching
(?!
(?: # Old RHS: List of expressions we don't want to match
\d+-\d*
|
-+
)
(?![-\d]) # End Boundary Condition to Enforce Greedy Matching
)
([-\d]+) # Old LHS: What we want to match
(?![-\d]) # End Boundary Condition to Enforce Greedy Matching
}{}xg;