我写了一个 RegExp 可以正确验证单一货币,例如 EUR
或 USD
:
const ccyRegEx = new RegExp(currencies.join('|'), 'i');
在给定 currencies = ["EUR", "USD", "JPY", "GBP"...] 的情况下,生成类似
EUR|USD|JPY|GBP...
的东西
我将如何使用这个 RegExp 和 currencies
数组作为输入来构造一个新的 RegExp 来验证货币对,例如。EURUSD
,USDJPY
?
currencies
数组很大并且可能会发生变化,因此我想动态创建此正则表达式,而不是对所有可能的货币对排列进行硬编码。
相同的货币对,例如EUREUR
和USDUSD
无效。
不同顺序的货币对是有效的,例如EURUSD
和USDEUR
。
最佳答案
您只需添加 {2}
即可精确匹配您的集合中的两个项目。
例如,/(a|b|c){2}/
将匹配 ab
、ca
但不匹配 ad
。
你可以像这样改变你的动态正则表达式:
const currencies = ["EUR", "USD", "JPY", "GBP"];
const singleMatch = new RegExp(currencies.join('|'));
console.log('single match - EUR:', singleMatch.test('EUR'));
const doubleMatch = new RegExp('(' + currencies.join('|') + '){2}');
console.log('double match - EUR:', doubleMatch.test('EUR'));
console.log('double match - USDEUR:', doubleMatch.test('USDEUR'));
console.log('double match - GBPEUR:', doubleMatch.test('GBPEUR'));
console.log('double match - GBPGDD:', doubleMatch.test('GBPGDD'));
注意:它也匹配EUREUR
。为避免这种情况,您应该使用负面回顾或负面回顾。
编辑
我整合了@PJProudhon 的负面前瞻实现,正如他在评论部分所说:
const currencies = ["EUR", "USD", "JPY", "GBP"];
const doubleMatch = new RegExp('(?:(' + currencies.join('|') + ')(?!\\1)){2}');
console.log('double match - EUREUR:', doubleMatch.test('EUREUR')); //expect false
谢谢@PJProudhon
关于包含子正则表达式的 Javascript 复合正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55185906/