微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用javascript中的正则表达式提取数组中代数表达式的系数和变量?

如何解决如何使用javascript中的正则表达式提取数组中代数表达式的系数和变量?

我想将代数部分存储在数组中。目前,我有这个,但它不能完全工作。

function exp(term) {
    var container = [];
    if (term[0] === '-') {
        container[0] = '-1';
        container[1] = term.match(/([0-9]+)/g)[0];
        container[2] = term.match(/([a-zA-Z]+)/g)[0];
    } 
    else {
        container[0] = '0';
        container[1] = term.match(/([0-9]+)/g)[0];
        container[2] = term.match(/([a-zA-Z]+)/g)[0];
    }
    return container;
}

console.log(exp('-24mn'));    //should output ['-1','24','mn']
console.log(exp('-100BC'));   //should output ['-1','100','BC']
console.log(exp('100BC'));    //should output ['0','BC']
console.log(exp('100'));      //should output ['0','']
console.log(exp('BC'));       //should output ['0','0','BC']
console.log(exp('-bC'));      //should output ['-1','bC']
console.log(exp('-100'));     //should output ['-1','']

但如果可能的话,我真正想要的只是一个长度为 2 的数组,其中包含系数和如下变量:

console.log(exp('-24mn'));    //should output ['-24','mn']
console.log(exp('-100BC'));   //should output ['-100','BC']
console.log(exp('100BC'));    //should output ['100','BC']
console.log(exp('100'));      //should output ['100','bC']
console.log(exp('-100'));     //should output ['-100','']

我只使用长度为 3 的数组方法,因为我不知道如何处理只有一个负号后跟变量(如“-bC”)和变量(如“BC”)的情况。任何帮助将不胜感激。提前致谢!

解决方法

您可以使用 groups 来捕获这两个部分并添加一些额外的逻辑来处理输入中不存在数字的情况:

function exp(term) {
    const matches = term.match(/(-?[0-9]*)([a-zA-Z]*)/);
    return [convertNumMatch(matches[1]),matches[2]];
}

function convertNumMatch(numMatch) {
    if (!numMatch)
        return '0';
    else if (numMatch === '-')
        return '-1';
    else
        return numMatch;
}
,

您尝试的模式包含所有也可以匹配空字符串的可选部分。

您可以交替使用 4 个捕获组。然后返回一个包含第 1 组和第 2 组的数组,或包含第 3 组和第 4 组的数组。

0-1 的值可以通过检查组 3(在代码中表示为 m[3])是否存在来确定。

^(-?\d+)([a-z]*)|(-)?([a-z]+)$
  • ^ 字符串开头
  • (-?\d+) Capture group 1 匹配可选的 - 和 1+ 个数字
  • ([a-z]*) 捕获 group 2 捕获可选字符 a-zA-Z
  • |
  • (-)?可选捕获 group 3 匹配 -
  • ([a-z]+) 捕获 group 4 匹配 1+ 个字符 a-zA-Z
  • $ 字符串结束

Regex demo

使用 /i 标志的不区分大小写匹配的示例:

const regex = /^(-?\d+)([a-z]*)|(-)?([a-z]+)$/gi;
const exp = str => Array.from(
  str.matchAll(regex),m => m[4] ? [m[3] ? -1 : 0,m[4]] : [m[1],m[2]]
);
[
  "-24mn","-100BC","100BC","100","BC","-bC","-100",""
].forEach(s =>
  console.log(exp(s))
);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。