目前,我使用这段代码来计算字符串中括号值的总和...
if ((string.match(/\((\d+)\)/g)||[]).length > 0) {
var total = 0;
string.replace(/\((\d+)\)/g, function(outerValue, innerValue){
if (!isNaN(innerValue.toString().trim())) {
total = total + Number(innerValue.toString().trim());
}
});
value = total;
}
...所以字符串...
(2) dark chocolate, (2) milk chocolate, and (1) white chocolate
...总计 5.
不愿意让 well-enough 一个人呆着,我想如果我能更花哨一点并解释不同类型的操作,这样就可以写了,那会很酷。
(2) dark + (2) milk - (1) white
-or-
(2) dark and (2) milk minus (1) white
所以我将代码更改为...
if ((string.match(/\((\d+)\)/g)||[]).length > 0) {
var total = 0;
string.replace(/^\((\d+)\)|and\s\((\d+)\)|plus\s\((\d+)\)|\+\s\((\d+)\)/g, function(outerValue, innerValue){
if (!isNaN(innerValue.toString().trim())) {
total = total + Number(innerValue.toString().trim());
}
});
value = total;
}
...但 innerValue 返回未定义。当我在 regex101.com 中使用验证器进行测试时,我能够提取值,但在 Javascript 中不能。
我做错了什么?
附注显然,我的代码不完整(除了错误之外)。最终,我会列出所有可能的运算符(例如,“+”、“加”、“和”、“少”、“减”、“-”等)并检查 outerValue 中的字符串以确定运算符(operator)。而且,当然,我需要在句子中编写逗号的逻辑(例如,允许在句子中使用单个运算符并将该操作应用于每个项目)。
最佳答案
您的参数名称 (outerValue, innerValue)
并不准确。替换函数的参数是
function replace(match, p1, p2, ..., pn, offset, string)
所以你有
p1 p2 p3 p4
| | | |
/^\((\d+)\)|and\s\((\d+)\)|plus\s\((\d+)\)|\+\s\((\d+)\)/g
|
match
因此,当您通过替换函数运行 (2) dark and (2) milk minus (1) white
时:
第一个匹配项“(2)”具有 p1=2
,因为它对应于正则表达式中的第一个括号集,即第一个 或 组。然后你有 p2=undefined, p3=undefined, p4=undefined
。
下一个匹配 "and (2)"有 p1=undefined
因为这个匹配正则表达式中的第二个或组,所以 p1=undefined, p2=2, p3=undefined, p4=undefined
关于javascript - 正则表达式帮助计算字符串中的括号值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48896283/