问题描述
所以我有这个包含数学表达式作为字符串的数据数组。
var data = ['1+1=?','123*45?=5?088','-5?*-1=5?','19--45=5?','??*??=302?','?*11=??','??*1=??','??+??=??']
问号表示未知数字,因此它是数字的一部分。如何将它们分开,以便将因子/加数、运算和答案存储在数组中?
这是我想要得到的结果:
'1+1=?' ---> ['1','+','1','?']
'123*45?=5?088' ---> ['123','*','45?' '5?088']
'-5?*-1=5?' ---> ['-5?','-1',5?']
'19--45=5?' ---> ['19','-','-45','5?']
'??*??=302?' ---> ['??','??','302?']
'?*11=??' ---> ['?','11','??']
'??*1=??' ---> ['??','??']
'??+??=??' ---> ['??','??']
这对我来说很棘手,尤其是负数减法。
提前致谢!
解决方法
你可以试试这个正则表达式:
-?[\d?]+|[^=]
-
-?[\d?]+
:数字和?
的任意组合,带有可选的前导-
。 -
|
:或 -
[^=]
:不是=
检查 test cases
const texts = [
'1+1=?','123*45?=5?088','-5?*-1=5?','19--45=5?','??*??=302?','?*11=??','??*1=??','??+??=??'
];
const regex = /-?[\d?]+|[^=]/g;
const groups = texts.map(text => text.match(regex));
console.log(groups);
编辑
如果格式一致,你可以试试这个正则表达式来得到等式的每一部分:
(-?[\d?]+)([^=\d?])(-?[\d?]+)=(-?[\d?]+)
const texts = [
'1+1=?','??+??=??','?33438-103326=410112'
];
const regex = /^(-?[\d?]+)([^=\d?])(-?[\d?]+)=(-?[\d?]+)$/;
const groups = texts.map(text => text.match(regex).splice(1));
console.log(groups);