Javascript 将字符串中的数值相加

Javascript 将字符串中的数值相加,javascript,regex,string,Javascript,Regex,String,我有一个从端点返回的字符串,在该端点中,我需要将字符串的某些部分添加到一起,以便生成两个不同的值 答复示例: 149226;147,226;146224 现在我知道我可以使用一元加号操作符来强制字符串像这样被视为一个数字 var num1 = '20', num2 = '22'; var total = (+num1) + (+num2); 或者我可以像这样做一些转换 var number1 = parseInt(num1); var number2 = parseInt

我有一个从端点返回的字符串,在该端点中,我需要将字符串的某些部分添加到一起,以便生成两个不同的值

答复示例:

149226;147,226;146224

现在我知道我可以使用一元加号操作符来强制字符串像这样被视为一个数字

var num1 = '20',
    num2 = '22';

var total = (+num1) + (+num2);
或者我可以像这样做一些转换

   var number1 = parseInt(num1);
   var number2 = parseInt(num2);

   var total = number1  + number2;
这两个工作都很好,但这不是我要找的确切

我想要这个结果

149226;147,226;146224

然后将第一个角之前的所有数字相加(149147146)生成一个结果,然后将第二个角之后的所有数字相加(226226224)


我知道我可能需要某种reg表达式,但我不知道是什么。

下面为字符串的
.split
提供了正则表达式,以便自己获得数字。然后你可以把其他数字加起来,但我不明白为什么不把它们按顺序加起来

const str='149226;147,226;146,224'
const total=str.split(/[;,]/).map(Number).reduce((a,b)=>a+b)

log('total',total)
您只需使用string.split,两次,一次用于;然后再次为,。并将其通过array.reduce

例如

var str='149226;147,226;146,224';
var result=str.split(“;”)
.减少((a,v)=>{
var vv=v.split(',');
a[0]+=vv[0]| 0;
a[1]+=vv[1]| 0;
返回a;
}, [0, 0]);

控制台日志(结果)不使用正则表达式,一种可能的解决方案:

var c='149226;147,226;146,224'
变量d=c.split(“;”)
var first=d.map(x=>Number(x.split(“,”[0]))
var second=d.map(x=>Number(x.split(“,”[1]))
console.log(第一个)
console.log(秒)
让resultFirst=first.reduce((a,b)=>a+b,0);
让resultSecond=second.reduce((a,b)=>a+b,0);
console.log(resultFirst)
console.log(resultSecond)
您可以执行以下操作:

constmystring='149226;147,226;146,224';
/*
* 1. 你用“;”把绳子分开获取字符串对数组的步骤
*然后你用“,”分开每对夫妇。这样,您将得到如下数组:
*    [['149', '266'], ['147', '266'], ['146', '264']]
*/
常量myNumbers=myString.split(';').map(numCouple=>numCouple.split(',');
/*
* 2. 您可以使用Array.prototype.reduce()来计算和
*/
const sum1=myNumbers.reduce((总和,项目)=>{
返回和+=parseInt(项[0]);
}, 0);
const sum2=myNumbers.reduce((总和,项目)=>{
返回和+=parseInt(第[1]项);
}, 0);
//或者,作为替代方案:
const sumsObj=myNumbers.reduce((对象,项目)=>{
obj.sum1+=parseInt(项[0]);
obj.sum2+=parseInt(第[1]项);
返回obj;
},{sum1:0,sum2:0});
//或者:
const sumsArr=myNumbers.reduce((会计科目,项目)=>{
acc[0]+=parseInt(项目[0]);
acc[1]+=parseInt(第[1]项);
返回acc;
}, [0, 0]);
//试验
log('sum1:',sum1);
log('sum2:',sum2);
console.log('------------');
console.log('sum1:',sumsObj.sum1);
log('sum2:',sumsObj.sum2);
console.log('------------');
log('sum1:',sumsArr[0]);

log('sum2:',sumsArr[1])我运行了这个:

const nums = ('149,226;147,226;146,224');
var firstNums = nums.match(/(?<=[0-9]*)[0-9]+(?=,)/gs);
var secondNums = nums.match(/(?<=[0-9]*)[0-9]+(?=;|$)/gs);
console.log(firstNums, secondNums);
let sumFirstNums = 0,  
    sumSecondNums = 0;
firstNums.map(x => {
  sumFirstNums += +x;
})
console.log(sumFirstNums)

secondNums.map(x => {
  sumSecondNums += +x;
})
console.log(sumSecondNums)

//If you want the result in the same format: 
const finalResult = `${sumFirstNums}, ${sumSecondNums};`
console.log(finalResult)
constnums=('149226;147226;146224');
var firstNums=nums.match(/(?){
sumSecondNums+=+x;
})
console.log(sumSecondNums)
//如果希望结果采用相同的格式:
const finalResult=`${sumFirstNums},${sumSecondNums}`
console.log(最终结果)

对于该字符串格式,您可以使用一个模式,其中两个捕获组在逗号之间匹配1+多个数字,并断言一个
或右边字符串的结尾

通过索引到每个迭代的
匹配项
,可以引用组值

(\d+),(\d+)(?=;|$)
模式匹配

  • (\d+)
    捕获组1,匹配1+个数字
  • 匹配逗号
  • (\d+)
    捕获组2,匹配1+个数字
  • (?=;|$)
    正向前瞻,直接在右侧断言a
    或字符串结尾
见a

让result1=0;
设result2=0
用于(常量匹配为“149226;147226;146224”。匹配所有(/(\d+),(\d+(=;|$)/g)){
结果1+=+匹配[1]
结果2+=+匹配[2]
}

console.log(result1,result2)
如果逗号之间有两个以上的数字怎么办?@ritaj更新为包含一个更通用的解决方案。这是一个很好的简单答案,但您的
第一个
第二个
是数组。总之,最好添加:
let resultFirst=first.reduce((a,b)=>a+b,0)
让resultSecond=second.reduce((a,b)=>a+b,0)谢谢,答案经过编辑以包含您的建议。但是,使用此方法分割结果时,您将得到此数组[“146224”、“144225”和“”。因此,您将在数组中获得一个空项。我想您每次都可以使用splice清除最后一项。通常,您应该获得第一项[149147146]和第二项[226224]。我编辑了这篇文章。运行代码片段,您将看到。抱歉,这是我的错误,响应也以;例如"149226,;147,226;146,224;'