使用正则表达式匹配公式字符串中的值时,我发现这个问题,即使匹配,正则表达式也会返回null。
var formula = "round((DATAtotal_sq_ft * .6) + (QTY16 * 4) + (QTY17 * 2) + QTY18 + QTY15 + QTY12 * 18 / 3000, 1)";
const qtyRegex = /(QTY)(\d*)|(LEN)(\d*)|(DATA)([a-zA-Z_-|\d]*)/gm;
let m;
while ((m = qtyRegex.exec(formula)) !== null) {
var val = 0; // Here is irrelevant code that gets the value
formula = formula.replace(m[0], val);
}
console.log(formula);
在上面的代码片段中,您可以看到一些值未被替换的结果,但同时所有值都被检测到 regex101 https://regex101.com/r/WTpvFq/1。出于某种原因,即使在阅读了类似问题的一些不同答案之后,我似乎无法缩小我的错误。
我可以使用一种解决方法并使用formula.match(qtyRegex)
,但我确信这只是正则表达式中的一个错误所以我更喜欢正确修复它而不是用补丁修补它。
答案 0 :(得分:1)
您可以直接使用RegExp替换replacer
String.replace这样的回调,而不是while循环:
formula = formula.replace(qtyRegex, replacer)
// take a look at the docs I've linked above for an explanation of these params
function replacer(match, p1, p2, ..., offset, string) {
let calculatedValue = 0 // perform your irrelevant code that gets the value here
return calculatedValue
}
答案 1 :(得分:0)
在regexp中使用g
修饰符时,它会记住字符串中最后匹配的位置,后续匹配从该位置开始。但是你的代码正在用更短的字符串替换匹配,所以记住的位置可能已经过了下一场比赛的开始,而且它没有找到它。
摆脱g
修饰符,每次都会从头开始搜索。
var formula = "round((DATAtotal_sq_ft * .6) + (QTY16 * 4) + (QTY17 * 2) + QTY18 + QTY15 + QTY12 * 18 / 3000, 1)";
const qtyRegex = /(QTY)(\d*)|(LEN)(\d*)|(DATA)([a-zA-Z_-|\d]*)/m;
let m;
while ((m = qtyRegex.exec(formula)) !== null) {
var val = 0; // Here is irrelevant code that gets the value
formula = formula.replace(m[0], val);
}
console.log(formula);