Простое решение:
s/\|(?=[^{}\n]*}})/^/g
Еще более простое решение, но, вероятно, оно во многих случаях не работает:
s/(?!^)\|/^/gm
Вот немного более надежное регулярное выражение:
s/(?:\G(?!^)(?:(?>[^|]*?}})(?>.*?{{))*|^(?>.*?{{))(?>[^|]*?(?=}}|\|))\K\|(?=.*?}})/^/gs;
Комментарий:
s/
(?:
\G(?!^) # inside of a {{}} tag
(?: (?>[^|]*?}}) (?>.*?{{) )* # read till we find a | in another tag if none in current
|
^(?>.*?{{) # outside of tag, parse till in
)
(?> [^|]*? (?=}}|\|) ) # eat till a | or end of tag
\K # don't include stuff to the left of \K in the match
\| # the |
(?=.*?}}) # just to make sure the tag is closed
/^/gsx;
Вход:
|}}
| Re|eased = {{start-date|June 14^, {|1972}|x}}
| Released = {{Start date}|1973|03|01}|df=y|}}
| || {{|}} {{ |
Выход:
|}}
| Re|eased = {{start-date^June 14^, {^1972}^x}}
| Released = {{Start date}^1973^03^01}^df=y^}}
| || {{^}} {{ |
Пример: http://ideone.com/fbY2W