javascript - 正则表达式帮助计算字符串中的括号值

标签 javascript regex

目前,我使用这段代码来计算字符串中括号值的总和...

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

参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_function_as_a_parameter

关于javascript - 正则表达式帮助计算字符串中的括号值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48896283/

相关文章:

python - 正则表达式简单的多行问题

c# - 用于字母和空格的 .NET RegEx

javascript - 修改伪元素:after's width using javascript

javascript - jquery 获取之前输入的文本值

javascript - 尝试在 ComponentDidMount 内使用异步 promise 填充 props

javascript - 不要在 iframe 滚动 Javascript 的末尾滚动视口(viewport)

javascript - 如何使事件单击事件在多次单击元素时仅触发一次

regex - Apache Spark以正则表达式读取文件

regex - 如何从 .htaccess 的正则表达式中的 url 捕获 %20?

javascript - 如何编写此正则表达式以获取多行数据并转换为 JSON 数组