const regex = /(?(DEFINE)
(?<currency_symbol> \p{Sc} )
(?<leading_group> [1-9] \d{0,2}+ )
(?<group> \d{3} )
(?<non_leading_groups> (?&group) (?:(?&group_delim)(?&group))*+ )
(?<decimal_delim>
(?# Use the opposite of group_delim. )
(?(group_delim_comma)
\.
| (?(group_delim_period)
,
| [,.] (?# There's no definitive grouping_delim. )
)
)
)
)
^
(?>
(?¤cy_symbol)
(?&leading_group)
(?:
(?<group_delim>
(?<group_delim_comma> , ) |
(?<group_delim_period> \. ) |
\ (?# Allow whitespace as a delimiter. )
)
(?&non_leading_groups)
| \d*+ (?# It's also possible that there's no delimiter. )
)
)
(?:
(?&decimal_delim)
\d*+
)?+
$/gum;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('(?(DEFINE)
(?<currency_symbol> \\p{Sc} )
(?<leading_group> [1-9] \\d{0,2}+ )
(?<group> \\d{3} )
(?<non_leading_groups> (?&group) (?:(?&group_delim)(?&group))*+ )
(?<decimal_delim>
(?# Use the opposite of group_delim. )
(?(group_delim_comma)
\\.
| (?(group_delim_period)
,
| [,.] (?# There\'s no definitive grouping_delim. )
)
)
)
)
^
(?>
(?¤cy_symbol)
(?&leading_group)
(?:
(?<group_delim>
(?<group_delim_comma> , ) |
(?<group_delim_period> \\. ) |
\\ (?# Allow whitespace as a delimiter. )
)
(?&non_leading_groups)
| \\d*+ (?# It\'s also possible that there\'s no delimiter. )
)
)
(?:
(?&decimal_delim)
\\d*+
)?+
$', 'gum')
const str = `We want to match these:
\$1
\$10
\$100
\$1000
\$1,000
\$10,000
\$100,000
\$1,000,000
\$1.00
\$100.00
\$10,000.00
\$1,000,000.00
\$1.000.000,00
\$1.000
\$1.000.000
\$1,00
\$1.000,00
\$10000000000000
We don't want to match these:
\$1,000,00
\$1,00,00
\$1.00.000
A few different currency symbols that we want to match:
\$1
¢1
£1
¤1
¥1
₠1
₡1
₢1
₣1
₤1
₥1
₦1
₧1
₩1
₪1
₫1
€1
₭1
₮1
₯1
₰1
₱1
₲1
₳1
₴1
₵1
₶1
₷1
₸1
₹1
₺1
₻1
₼1
₽1
Nearby symbols that share some bytes (UTF-8) that we don't want to match:
¡1
¦1
§1
©1
ₔ1`;
// 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