use strict;
my $str = '$$
\\Gamma(z) = \\int_0^\\infty t^{z-1}e^{-t}dt\\,.
$$
This is some text $math \\frac12$
other text $\\unsupported$
Other node \\[ displaymath \\\\[\\\\] \\frac{1}{2} \\] blah
$$ \\int_2^3 $$
more text \\(and math\\) blah
And $math with a
\\$ sign$.
This should not match↓
$$$
\\Gamma(z) = \\int_0^\\infty t^{z-1}e^{-t}dt\\,.
$$$
This should not match either
$$
\\Gamma(z) = \\int_0^\\infty t^{z-1}e^{-t}dt\\,.
$
';
my $regex = qr/(?<katex_all>
(?:
(?<!\\|\$)
(?<katex_open>
\${2}
|
\${1}
)
(?!\$)
\n?
(?<katex_content>.+?)\n?
(?<!\\|\$)
(?<katex_close>\g{katex_open})
(?!\$)
\n?
)
|
(?:
(?<!\\)
(?<katex_open>\\\[)
\n?
(?<katex_content>.+?)\n?
(?<!\\)
(?<katex_close>
\\\]
)\n?
)
|
(?:
(?<!\\)
(?<katex_open>\\\()
\n?
(?<katex_content>.+?)\n?
(?<!\\)
(?<katex_close>
\\\)
)\n?
)
)/mxsp;
if ( $str =~ /$regex/g ) {
print "Whole match is ${^MATCH} and its start/end positions can be obtained via \$-[0] and \$+[0]\n";
# print "Capture Group 1 is $1 and its start/end positions can be obtained via \$-[1] and \$+[1]\n";
# print "Capture Group 2 is $2 ... and so on\n";
}
# ${^POSTMATCH} and ${^PREMATCH} are also available with the use of '/p'
# Named capture groups can be called via $+{name}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Perl, please visit: http://perldoc.perl.org/perlre.html