包含子正则表达式的 Javascript 复合正则表达式

标签 javascript regex parsing

我写了一个 RegExp 可以正确验证单一货币,例如 EURUSD:

const ccyRegEx = new RegExp(currencies.join('|'), 'i');

在给定 currencies = ["EUR", "USD", "JPY", "GBP"...] 的情况下,生成类似 EUR|USD|JPY|GBP... 的东西

我将如何使用这个 RegExp 和 currencies 数组作为输入来构造一个新的 RegExp 来验证货币对,例如。EURUSDUSDJPY?

currencies 数组很大并且可能会发生变化,因此我想动态创建此正则表达式,而不是对所有可能的货币对排列进行硬编码。

相同的货币对,例如EUREURUSDUSD 无效。
不同顺序的货币对是有效的,例如EURUSDUSDEUR

最佳答案

您只需添加 {2} 即可精确匹配您的集合中的两个项目。

例如,/(a|b|c){2}/ 将匹配 abca 但不匹配 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/

相关文章:

javascript - 添加多行 google-spreadsheet npm

javascript - Node/Express - 如何等到 For 循环结束以 JSON 响应

javascript - 函数内的 'this' 不应该指向对象本身吗?

javascript - React-Navigation:每当页面导航到时调用函数

regex - 正则表达式帮助 - 前瞻

两个反斜杠的 ruby 正则表达式

c - 如何使用 yacc 解析 if/else 语句

javascript - 仅当包含的字符串长度大于 X 时才替换

python - 根据先前的元素解析项目

javascript - 在 javascript 中解析 XML - 没有浏览器 - 没有 XML 解析器