Учитывая группы в вашем регулярном выражении, это просто плоский поиск объекта совпадения,
который в C ++ является проверкой флага (int), без заметных накладных расходов.
( [cdefgab] ) # (1)
( [b#]{0,1} ) # (2)
( [0-9] ) # (3)
| ( [0-9]{3} ) # (4)
| ( [A-Z0-9]{2} ) # (5)
И возможное использование
wregex MyRx = wregex( "([cdefgab])([b#]{0,1})([0-9])|([0-9]{3})|([A-Z0-9]{2})", 0);
wstring::const_iterator start = str.begin();
wstring::const_iterator end = str.end();
wsmatch m;
while ( regex_search( start, end, m, MyRx ) )
{
if ( m[1].matched )
// First alternation
else
if ( m[4].matched )
// Second alternation
else
if ( m[5].matched )
// Third alternation
start = m[0].second;
}