const regex = /\$
(?=[^$]{3,100}\$)
(?<PH>[A-Za-z0-9:_-]{1,20})
(?:
(?<C1>\/)
(?<RX>(?:[^\\\/\r\n]|\\\/?)*)
\/
(?:
(?<R>(?:[^\\\/\r\n$]|\\[\/$]?)*)
\/
|
(?<G>\d*)
)
|
(?:
(?<C2>\()
(?<F>(?:[^\t\r\n\f()]|\\[()]?)*)
\)
)?
)
\$/gmi;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('\\$
(?=[^$]{3,100}\\$)
(?<PH>[A-Za-z0-9:_-]{1,20})
(?:
(?<C1>\\\/)
(?<RX>(?:[^\\\\\\\/\\r\\n]|\\\\\\\/?)*)
\\\/
(?:
(?<R>(?:[^\\\\\\\/\\r\\n$]|\\\\[\\\/$]?)*)
\\\/
|
(?<G>\\d*)
)
|
(?:
(?<C2>\\()
(?<F>(?:[^\\t\\r\\n\\f()]|\\\\[()]?)*)
\\)
)?
)
\\$', 'gmi')
const str = ` \$EX1\$ -> EX1
\$EX2(a\$b\$c)\$ -> EX2, (, a\$b\$c
\$EX3(abc\\x/)\$ -> EX3, (, abc\\x/
\$EX4(\\@\\,/&/)\$ -> EX4, (, \\@\\,/&/
\$EX5/X(Z)Y/\$ -> EX5, /, X(Z)Y
\$EX6/X(ABC)/1\$ -> EX6, /, X(ABC), 1
\$EX7/X\\\\Z\\/Y/\$ -> EX7, /, X\\\\Z\\/Y
\$EX8/(A)/(B)/\$ -> EX8, /, (A), (B)
\$EX9/(\\\\\$A\$)\\//(\\\\\$B\$\\/)/\$ -> EX9, /, (\\\\\$A\$)\\/, (\\\\\$B\$\\/)
Lorem Ip\$um \$EX1\$i\$ simply dummy \$EX1\$\$EX2(abc)\$ te\$t of the printing and
type\$EX2(abc)\$etting indu\$try. \$EX3(abc\\x/)\$ Lorem \$EX4(\\@\\,/&/)\$Ipsum has been the
industry'\$EX5/X(Z)Y/\$ standard du\$EX6/X(ABC)/1\$mmy text \$EX7/X\\\\Z\\/Y/\$ ever \$\$\$ince the
1500\$EX8/(A)/(B)/\$, when an \$ unknown \$EX9/(\\\\\$A\$)\\//(\\\\\$B\$\\/)/\$ printer took a galley of type `;
// 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