JavaScript - 使用RegExp匹配字母数字模式

3
我对正则表达式和JS都比较陌生(之前使用的是Python),所以这可能是一个简单的问题:我正在尝试在Javascript中编写代数计算器,它将接收一个代数方程作为字符串,例如:
string = 'x^2 + 30x -12 = 4x^2 - 12x + 30';
该算法已经能够将字符串拆分成一个单独的列表,其中右侧所有值乘以-1以使其等于0。然而,解决该方程的其中一步涉及创建一个hashtable/dictionary,以变量作为键。 上面的字符串结果为一个列表eq:
eq = ['x^2','+30x','-12','-4x^2','+12x','-30'];
我当前计划通过迭代此列表,并使用RegExp来识别变量和相应的乘数,以创建一个Hashtable/Dictionary,从而允许我简化方程,如下所示:
hashTable = {
    'x^2': [1, -4],
    'x': [30, 12],
    ' ': [-12]
}

我打算使用某种for循环来遍历数组,并对每个字符串应用匹配来获取所需的值,但是坦白地说,我被难住了。 我已经使用RegExp将字符串分离成方程式的各个部分并删除空格,但我想不出一种方法将-4x^2'-4x^2'中分开。


请返回已翻译的文本:重复https://dev59.com/qHRC5IYBdhLWcg3wK9yV - Chris Hawkes
3个回答

1
你可以尝试这个正则表达式:(-?\d+)x\^\d+。当你执行match函数时:
var res = "-4x^2".match(/(-?\d+)x\^\d+/)

你将会得到一个数组res:["-4x^2", "-4"] 在res[1]中有你的"-4"。
通过在第二个\d+(数字字符)上添加另一个组,你可以获得x的幂。
var res = "-4x^2".match(/(-?\d+)x\^(\d+)/) //res = [ "-4x^2", "-4", "2" ]

希望它有所帮助。

0
function splitTerm(term) {
    var regex = /([+-]?)([0-9]*)?([a-z](\^[0-9]+)?)?/
    var match = regex.exec(term);
    return {
        constant: parseInt((match[1] || '') + (match[2] || 1)),
        variable: match[3]
    }
}

splitTerm('x^2');  // => {constant:   1, variable: "x^2"}
splitTerm('+30x'); // => {constant:  30, variable: "x"}
splitTerm('-12');  // => {constant: -12, variable: undefined}

此外,这些工具可以帮助您分析和理解正则表达式:

0

如果您知道哈希表的左侧将位于字符串末尾。比如说'4x',其中x在末尾或者'-4x^2',其中x^2在末尾,那么我们就可以获取表达式的数字:

var exp = '-4x^2'
exp.split('x^2')[0] // will return -4

我希望这就是你在寻找的。


是的,它确实帮了很大的忙。我可能仍然会使用RegExp来发现方程中最大的指数,以便动态创建split参数,这样代码可以重复使用于三元及以上的方程。 - Matheus Avila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接