const regex = /(\s*\{(?:\s*"Modulus"\s*:\s*"[a-zA-Z\d\+\/]+={0,2}"\s*(?(3)(?(4)(?(5)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\s*"Exponent"\s*:\s*"[a-zA-Z\d\+\/]+={0,2}"\s*(?(2)(?(4)(?(5)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\s*"P"\s*:\s*"[a-zA-Z\d\+\/]+={0,2}"\s*(?(2)(?(3)(?(5)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\s*"Q"\s*:\s*"[a-zA-Z\d\+\/]+={0,2}"\s*(?(2)(?(3)(?(4)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\s*"DP"\s*:\s*"[a-zA-Z\d\+\/]+={0,2}"\s*(?(2)(?(3)(?(4)(?(5)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\s*"DQ"\s*:\s*"[a-zA-Z\d\+\/]+={0,2}"\s*(?(2)(?(3)(?(4)(?(5)(?(6)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\s*"InverseQ"\s*:\s*"[a-zA-Z\d\+\/]+={0,2}"\s*(?(2)(?(3)(?(4)(?(5)(?(6)(?(7)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\s*"D"\s*:\s*"[a-zA-Z\d\+\/]+={0,2}"\s*(?(2)(?(3)(?(4)(?(5)(?(6)(?(7)(?(8)|,)|,)|,)|,)|,)|,)|,)()){8}\s*\}\s*\2\3\4\5\6\7\8\9)|(\s*\{(?:\s*"Modulus"\s*:\s*"[a-zA-Z\d\+\/]+={0,2}"\s*(?(12)|,)()|\s*"Exponent"\s*:\s*"[a-zA-Z\d\+\/]+={0,2}"\s*(?(11)|,)()){2}\s*\}\s*\11\12)/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('(\\s*\\{(?:\\s*"Modulus"\\s*:\\s*"[a-zA-Z\\d\\+\\\/]+={0,2}"\\s*(?(3)(?(4)(?(5)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\\s*"Exponent"\\s*:\\s*"[a-zA-Z\\d\\+\\\/]+={0,2}"\\s*(?(2)(?(4)(?(5)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\\s*"P"\\s*:\\s*"[a-zA-Z\\d\\+\\\/]+={0,2}"\\s*(?(2)(?(3)(?(5)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\\s*"Q"\\s*:\\s*"[a-zA-Z\\d\\+\\\/]+={0,2}"\\s*(?(2)(?(3)(?(4)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\\s*"DP"\\s*:\\s*"[a-zA-Z\\d\\+\\\/]+={0,2}"\\s*(?(2)(?(3)(?(4)(?(5)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\\s*"DQ"\\s*:\\s*"[a-zA-Z\\d\\+\\\/]+={0,2}"\\s*(?(2)(?(3)(?(4)(?(5)(?(6)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\\s*"InverseQ"\\s*:\\s*"[a-zA-Z\\d\\+\\\/]+={0,2}"\\s*(?(2)(?(3)(?(4)(?(5)(?(6)(?(7)(?(9)|,)|,)|,)|,)|,)|,)|,)()|\\s*"D"\\s*:\\s*"[a-zA-Z\\d\\+\\\/]+={0,2}"\\s*(?(2)(?(3)(?(4)(?(5)(?(6)(?(7)(?(8)|,)|,)|,)|,)|,)|,)|,)()){8}\\s*\\}\\s*\\2\\3\\4\\5\\6\\7\\8\\9)|(\\s*\\{(?:\\s*"Modulus"\\s*:\\s*"[a-zA-Z\\d\\+\\\/]+={0,2}"\\s*(?(12)|,)()|\\s*"Exponent"\\s*:\\s*"[a-zA-Z\\d\\+\\\/]+={0,2}"\\s*(?(11)|,)()){2}\\s*\\}\\s*\\11\\12)', 'gm')
const str = `
{
"Modulus": "AQAB",
"Exponent": "AQAB",
"P": "AQAB",
"Q": "AQAB",
"DP": "AQAB",
"DQ": "AQAB",
"InverseQ": "AQAB",
"D": "AQAB"
}
{
"Modulus": "AQAB",
"Exponent": "AQAB"
}
(?(1)(?(2)(?(3)(?(4)(?(5)(?(6)(?(7)|,)|,)|,)|,)|,)|,)|,)
2-3-4-5-6-7-8-9
(?(3)(?(4)(?(5)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)
(?(2)(?(4)(?(5)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)
(?(2)(?(3)(?(5)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)
(?(2)(?(3)(?(4)(?(6)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)
(?(2)(?(3)(?(4)(?(5)(?(7)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)
(?(2)(?(3)(?(4)(?(5)(?(6)(?(8)(?(9)|,)|,)|,)|,)|,)|,)|,)
(?(2)(?(3)(?(4)(?(5)(?(6)(?(7)(?(9)|,)|,)|,)|,)|,)|,)|,)
(?(2)(?(3)(?(4)(?(5)(?(6)(?(7)(?(8)|,)|,)|,)|,)|,)|,)|,)
(?(DEFINE)(?P<b64>[a-zA-Z\\d\\+\\/]+={0,2})(?P<Q1>\\s*")(?P<C1>(?(22)(?(23)(?(24)(?(25)(?(26)(?(27)(?(28)|,)|,)|,)|,)|,)|,)|,))(?P<C2>(?(21)(?(23)(?(24)(?(25)(?(26)(?(27)(?(28)|,)|,)|,)|,)|,)|,)|,))(?P<C3>(?(21)(?(22)(?(24)(?(25)(?(26)(?(27)(?(28)|,)|,)|,)|,)|,)|,)|,))(?P<C4>(?(21)(?(22)(?(23)(?(25)(?(26)(?(27)(?(28)|,)|,)|,)|,)|,)|,)|,))(?P<C5>(?(21)(?(22)(?(23)(?(24)(?(26)(?(27)(?(28)|,)|,)|,)|,)|,)|,)|,))(?P<C6>(?(21)(?(22)(?(23)(?(24)(?(25)(?(27)(?(28)|,)|,)|,)|,)|,)|,)|,))(?P<C7>(?(21)(?(22)(?(23)(?(24)(?(25)(?(26)(?(28)|,)|,)|,)|,)|,)|,)|,))(?P<C8>(?(21)(?(22)(?(23)(?(24)(?(25)(?(26)(?(27)|,)|,)|,)|,)|,)|,)|,))(?P<Q2>"\\s*:\\s*"(?P>b64)"\\s*)(?P<Modulus>(?P>Q1)Modulus(?P>Q2))(?P<Exponent>(?P>Q1)Exponent(?P>Q2))(?P<P>(?P>Q1)P(?P>Q2))(?P<Q>(?P>Q1)Q(?P>Q2))(?P<DP>(?P>Q1)DP(?P>Q2))(?P<DQ>(?P>Q1)DQ(?P>Q2))(?P<InverseQ>(?P>Q1)InverseQ(?P>Q2))(?P<D>(?P>Q1)D(?P>Q2)))(\\s*{\\s*)(?:(?P>Modulus)(?P>C1)()|(?P>Exponent)(?P>C2)()|(?P>P)(?P>C3)()|(?P>Q)(?P>C4)()|(?P>DP)(?P>C5)()|(?P>DQ)(?P>C6)()|(?P>InverseQ)(?P>C7)()|(?P>D)(?P>C8)()){8}\\s*}`;
// 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