The regular expression:
(?s-imx:((?:(?:[^\n@]+|@[^@]*@)\n?)+))
matches as follows:
NODE EXPLANATION
----------------------------------------------------------------------
(?s-imx: group, but do not capture (with . matching
\n) (case-sensitive) (with ^ and $ matching
normally) (matching whitespace and #
normally):
----------------------------------------------------------------------
( group and capture to \1:
----------------------------------------------------------------------
(?: group, but do not capture (1 or more
times (matching the most amount
possible)):
----------------------------------------------------------------------
(?: group, but do not capture:
----------------------------------------------------------------------
[^\n@]+ any character except: '\n'
(newline), '@' (1 or more times
(matching the most amount possible))
----------------------------------------------------------------------
| OR
----------------------------------------------------------------------
@ '@'
----------------------------------------------------------------------
[^@]* any character except: '@' (0 or more
times (matching the most amount
possible))
----------------------------------------------------------------------
@ '@'
----------------------------------------------------------------------
) end of grouping
----------------------------------------------------------------------
\n? '\n' (newline) (optional (matching the
most amount possible))
----------------------------------------------------------------------
)+ end of grouping
----------------------------------------------------------------------
) end of \1
----------------------------------------------------------------------
) end of grouping
----------------------------------------------------------------------
####
use warnings;
use strict;
use YAPE::Regex::Explain;
my $REx = qr/((?:(?:[^\n@]+|@[^@]*@)\n?)+)/s;
print YAPE::Regex::Explain->new($REx)->explain;
##
##
my $REx =
qr/
(
(?:
(?:
[^\n@]+
|
@
[^@]*
@
)
\n?
)+
)
/gsx;