$re = qr /(?:[\s\n]*|[\s]*%[^\n]*\n)* (? # start capture buffer 1? \{ # match an opening paren ( # capture buffer 2 (?: # match one of: (?> # don't backtrack over the inside of this group [^{}]+ # one or more ) # end non backtracking group | # ... or ... (?&first) # recurse to opening 1 and try it again &first )*? # 0 or more times. ) # end of buffer 2 \} # match a closing paren ) # end capture buffer one /x; $s="\\Befehl{1}{2}{3}"; print "Test mit \$re\$re\$re:\n"; if ($s =~ /\\Befehl$re$re$re/g){ foreach $expr (1..$#-) { print "\targument $expr = $$expr\n"; }; }; $s="\\Befehl{1}{2}{3}"; print "Test mit \$re{3}\n"; if ($s =~ /\\Befehl$re{3}/g){ foreach $expr (1..$#-) { print "\targument $expr = $$expr\n"; }; }; $s="\\Befehl{1}{2}{3}"; print "Test mit (?:\$re){3}\n"; if ($s =~ /\\Befehl(?:$re){3}/g){ foreach $expr (1..$#-) { print "\targument $expr = $$expr\n"; }; };