Only when the ^ or $ were at the start/end of your string is it simple. Eg:
(a|b|^)(c|d|^)foo
Rewriting without ^ can require much longer regex. (a|b|^)(c|d|^)foo
Rewriting without ^ can require much longer regex. ((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!)In an engine supporting ^ and $, searching for this
(a|b|^)(c|d|^)foo
is equivalent to searching for this ^((.*a|.*b)(c|d)|c|d)?foo.*$
And in this context you can drop the leading/trailing ^/$ since they are implicit.