in reply to A tidier regex ?

Here's an approach I like because it tends to encourage clear definition and easy maintenance of regexes. It can be quite a bit more verbose than a 'one-liner' approach, but can pay dividends when it's 3AM and you're trying to figure out what went wrong.

The code assumes the following 'requirements' as they have emerged (by inference, implication or suggestion) in discussion:

>perl -wMstrict -le "my $body = qr{ [[:upper:]\d]+ }xms; my $cdc = qr{ CDC (?: _ $body){2} }xms; my $smr = qr{ DDCSMR $body }xms; my $rmr = qr{ DDCRMR $body }xms; my $valid = qr{ \A \s* (?: $cdc | $smr | $rmr) \s* \z }xms; while (<>) { chomp; last unless $_; printf qq{'$_' %svalid \n}, m{$valid} ? '' : 'IN'; } " CDC_ ' CDC_ ' INvalid CDC_1_ANSND ' CDC_1_ANSND' valid CDC_ASD_ERTY ' CDC_ASD_ERTY ' valid XYZZY 'XYZZY' INvalid DDCRMRA ' DDCRMRA ' valid DDCSMR 'DDCSMR' INvalid

Note that the two regexes
    my $smr = qr{ DDCSMR $body }xms;
    my $rmr = qr{ DDCRMR $body }xms;
could be combined to a single regex, e.g. (untested)
    my $ddc = qr{ DDC [SR] MR $body }xms;
and the validation regex would simplify somewhat to
    my $valid = qr{ \A \s* (?: $cdc | $ddc) \s* \z }xms;