For Column D you could use Words(), Substitute() and Associative Array() + Intersect, in a formula, to find exact matches
aa1 = Associative Array(Words(:Column B, ","));
aa2 = Associative Array(Words(Substitute(:Column C, ":", "-"), " \!N"));
aa1 << Intersect(aa2);
Concat Items(aa1 << Get Keys, ",");
For Column C you can get good ideas from Regex: can't get all parts of the string that match
Edit:
Here is one option for Column C which might work. If you don't understand what it does, I suggest using While loop and Regex as that is generally easier to understand than JMP's pattern matching.
result = {};
Pat Match(
:Column A,
Pat Repeat(
(Pat Regex("(DQ[AB]1.+)[\s$]") >> result)
|
Pat Len(1)
)
);
Concat Items(Words(result, " "), ", ");
-Jarmo