En todo tienes razón, sobre todo... debes aprender a jugar con las expresiones, en ves de pedir permiso....
en tu expresión, cancelas la captura con (?:foo|bar) pero, esto puede ser util.... pero hay casos donde es un arma de doble filo, pudiéndote capturar
mira, ya lo has logrado agrupándolas como opciones, pero esto lleva un problema... que si bien puede localizar estas opciones, al final... puede no acertar en las parejas de estas etiquetas... (hemos usado la captura
\\1, ya que contiene la palabra del grupo de opciones.... haciendo coincidir el patrón)
la idea es esta
Código:
/\[(tag|foo|bar)\](.+?)\[\/\\1\]/
de modo, que busca cualquier [tag[foo[bar]]] ... [/tag[/foo[/bar]]] respetando su etiqueta de apertura, y coincidiendo solamente en las parejas.... (espero que se entienda)
suerte!
PDTA: no olvides googlear y leer algunas referencias y documentación de regex (expresiones regulares)