const regex = /(?<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?
)
)/gms;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('(?<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?
)
)', 'gms')
const 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\\,.
\$
`;
// Reset `lastIndex` if this regex is defined globally
// regex.lastIndex = 0;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
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 JavaScript, please visit: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions