Ваше утверждение, что без подгруппы + конкатенации невозможно обойтись, верно.
Вы также можете поступить как Джефф-Хиллман и просто убрать плохих персонажей после факта.
Важно отметить, что вы «не используете регулярные выражения для всего».
Regex разработан для менее сложных решений нетривиальных задач, и вы не должны использовать «о, мы будем использовать регулярные выражения» для всего, и вы не должны думать о том, что вы можете решить проблема в одношаговом регулярном выражении.
Когда есть жизнеспособный тривиальный метод, который работает, во что бы то ни стало, используйте его.
Альтернативная идея, если вам, возможно, понадобится вернуть несколько совпадений в теле кода, - это поиск регулярных выражений на основе «обратного вызова» ваших языков, который позволяет передавать любую найденную группу в вызов функции, который может сделать подстановка строк. (Особенно удобно при замене регулярных выражений).
Не уверен, как это будет работать в .Net, но в php вы бы сделали что-то вроде (не точный код)
function strip_reverse( $a )
{
$a = preg_replace("/-/", "", $a );
return reverse($a);
}
$b = preg_replace_callback( "/(AB[-]?cde)/" , 'strip_reverse' , "Hello World AB-cde" ;