Isn't that just
((a|b)?(c|d)|c|d)?foo
Unless you mean it as a search expression, in which case it's more like ((.*a|.*b)(c|d)|c|d)?foo
Which I have to admit was a lot harder to figure out than I thought it would be (and may not even be right!)