包含子RegExp的Javascript复合RegExp
我已经编写了一个RegExp,可以正确验证单一货币,例如欧元或美元: 这就产生了欧元|美元|日元|英镑。。。给定货币=[欧元、美元、日元、英镑……] 我如何使用这个RegExp和货币数组作为输入来构造一个新的RegExp来验证货币对,例如欧元兑美元、美元兑日元 货币数组很大,可能会发生变化,所以我想动态创建这个正则表达式,而不是硬编码所有可能的货币对排列 相同的货币对,例如欧元和美元无效。包含子RegExp的Javascript复合RegExp,javascript,regex,parsing,Javascript,Regex,Parsing,我已经编写了一个RegExp,可以正确验证单一货币,例如欧元或美元: 这就产生了欧元|美元|日元|英镑。。。给定货币=[欧元、美元、日元、英镑……] 我如何使用这个RegExp和货币数组作为输入来构造一个新的RegExp来验证货币对,例如欧元兑美元、美元兑日元 货币数组很大,可能会发生变化,所以我想动态创建这个正则表达式,而不是硬编码所有可能的货币对排列 相同的货币对,例如欧元和美元无效。 不同顺序的货币对是有效的,例如欧元兑美元和美元兑欧元。我想说的是保持简单,并构建一个包含所有可能性的中间数
不同顺序的货币对是有效的,例如欧元兑美元和美元兑欧元。我想说的是保持简单,并构建一个包含所有可能性的中间数组,例如:
const currenciesPair = [];
const currenciesLength = currencies.length
for (let i = 0; i < currenciesLength ; i++) {
for (let j = 0; j < currenciesLength ; j++) {
// avoiding pair such as EUREUR, USDUSD, etc...
if (i !== j) {
currenciesPair.push(currencies[i] + currencies[j]);
}
}
}
使用此数组保留正则表达式您还可以混合使用currencespair和currencespair以获得完全的可能性:我想说的是保持简单愚蠢,并使用所有可能性构建一个中间数组,例如:
const currenciesPair = [];
const currenciesLength = currencies.length
for (let i = 0; i < currenciesLength ; i++) {
for (let j = 0; j < currenciesLength ; j++) {
// avoiding pair such as EUREUR, USDUSD, etc...
if (i !== j) {
currenciesPair.push(currencies[i] + currencies[j]);
}
}
}
使用这个数组保留正则表达式,您还可以混合使用currencespair和currencespair,以获得完全的可能性:您只需添加{2}即可精确匹配集合中的两项
例如,/a | b | c{2}/将匹配ab、ca而不是ad
可以按如下方式更改动态正则表达式:
常量货币=[欧元、美元、日元、英镑];
const singleMatch=new regexpcurrences.join'|';
console.log'singleMatch-EUR:',singleMatch.test'EUR';
const doubleMatch=new RegExp+currencies.join'|'+'{2}';
console.log'doubleMatch-EUR:',doubleMatch.test'EUR';
console.log'double match-USDEUR:',doubleMatch.test'USDEUR';
console.log'double-match-GBPEUR:',doubleMatch.test'GBPEUR';
log'double match-GBPGDD:',doubleMatch.test'GBPGDD' 您只需添加{2}即可精确匹配集合中的两项
例如,/a | b | c{2}/将匹配ab、ca而不是ad
可以按如下方式更改动态正则表达式:
常量货币=[欧元、美元、日元、英镑];
const singleMatch=new regexpcurrences.join'|';
console.log'singleMatch-EUR:',singleMatch.test'EUR';
const doubleMatch=new RegExp+currencies.join'|'+'{2}';
console.log'doubleMatch-EUR:',doubleMatch.test'EUR';
console.log'double match-USDEUR:',doubleMatch.test'USDEUR';
console.log'double-match-GBPEUR:',doubleMatch.test'GBPEUR';
log'double match-GBPGDD:',doubleMatch.test'GBPGDD' 不过,这是一个相当低效的算法,因此根据货币数量,其他选项会更好 如果数据集可行,我更喜欢克里斯蒂安·特拉娜的解决方案 常量货币=[欧元、美元、日元、英镑]; const product_matrix=货币//循环所有货币 .map currency=>currences//我们希望将该货币与所有其他货币合并 .map对=>货币!==pair//仅当货币及其对不相同时才执行联接 ? `${货币}${pair}` :null .filter Boolean//删除所有空值。您可以使用reduce而不是map来跳过此步骤。 .平坦;//将二维数组展平为一维数组。
console.log产品_矩阵 不过,这是一个相当低效的算法,因此根据货币数量,其他选项会更好 如果数据集可行,我更喜欢克里斯蒂安·特拉娜的解决方案 常量货币=[欧元、美元、日元、英镑]; const product_matrix=货币//循环所有货币 .map currency=>currences//我们希望将该货币与所有其他货币合并 .map对=>货币!==pair//仅当货币及其对不相同时才执行联接 ? `${货币}${pair}` :null .filter Boolean//删除所有空值。您可以使用reduce而不是map来跳过此步骤。 .平坦;//将二维数组展平为一维数组。
console.log产品_矩阵;同样的方式?curencies=[欧元兑美元,美元兑日元]?或者问题是你如何用[EUR,USD,JPY]作为输入来构造数组[EURUUSD,EURJPY,USDEUR,JPYEUR,USDJPY,JPYUSD]。@如果不清楚,很抱歉,货币数组很大,可能会发生变化,所以我想动态创建这个正则表达式,没有硬编码所有可能的货币对排列,因此我问您是否要创建“[EUR USD,EURJPY,USDEUR,JPYEUR,USDJPY,JPYUSD],并将[EUR,USD,JPYUSD]作为输入。我想是的?@Shilly啊是的,有了货币数组作为输入,我没有货币对数组不幸的是,你从哪里得到货币数组?同样的方法?curencies=[欧元兑美元,美元兑日元]?或者问题是你如何用[EUR,USD,JPY]作为输入来构造数组[EURUUSD,EURJPY,USDEUR,JPYEUR,USDJPY,JPYUSD]。@如果不清楚,很抱歉,货币数组很大,可能会发生变化,所以我想动态创建这个正则表达式,而不是硬编码所有可能的p
货币对的变体因此,我问您是否要创建“[EUR USD,EURJPY,USDEUR,JPYEUR,USDJPY,JPYUSD],并将[EUR,USD,JPYUSD]作为输入。我想是的?@Shilly啊是的,以货币数组作为输入,我没有货币对数组不幸的是,你从哪里得到货币数组?啊当然,啊是的,我应该提到相同的货币对无效,但无论如何,谢谢!不确定什么是负面展望,您是否能够编辑您的解决方案以包含它?或者负面展望:如:a | b | c\1{2}.谢谢@PJProudhon,我把你的提示整合到了答案中。当然,啊,是的,我应该提到相同的货币对是无效的,但无论如何,谢谢!不确定什么是负面展望,您是否能够编辑您的解决方案以包含它?或者负面展望:如:a | b | c\1{2}.谢谢@PJProudhon,我将你的提示整合到回答中我认为这是完全有效的最佳解决方案,谢谢:至少在变量中缓存currences.length如果你这样做,否则它将是最慢的解决方案。const currency_count=currencies.length;对于我来说,