Az első legális, viszont nem azonos a másik kettővel, azoknál ugyanis a group nem fog létezni, ha nem illeszkedik a "foo". Azok helyesen: ((?:foo)?)bar (én ezt szoktam használni, a pipe-os megoldásra soha nem gondoltam :) ((?:foo){,1})bar