5

我将有一个长度不超过 8 个字符的字符串,例如:

// represented as array to demonstrate multiple examples
var strs = [
    '11111111',
    '1RBN4',
    '12B5'
]    

通过函数运行时,我希望将所有数字字符相加以返回最终字符串:

var strsAfterFunction = [
    '8',
    '1RBN4',
    '3B5'
]

您可以看到1第一个字符串中的所有 8 个单个字符都以单个字符串8结尾,第二个字符串保持不变,因为在任何时候都没有相邻的数字字符,第三个字符串随着12字符变为 a3和其余字符而变化字符串不变。

我相信用伪代码做到这一点的最好方法是:

1. split the array by regex to find multiple digit characters that are adjacent
2. if an item in the split array contains digits, add them together
3. join the split array items

.split由多个相邻数字字符分割的正则表达式是什么,例如:

var str = '12RB1N1'
  => ['12', 'R', 'B', '1', 'N', '1']

编辑:

问题:字符串“999”的结果应该是“27”还是“9”呢?

如果很清楚,请始终对数字求和,999=> 27234=>9

4

3 回答 3

12

您可以为整个转换执行此操作:

var results = strs.map(function(s){
    return s.replace(/\d+/g, function(n){
       return n.split('').reduce(function(s,i){ return +i+s }, 0)
    })
});

对于您的strs数组,它返回["8", "1RBN4", "3B5"].

于 2013-06-11T19:18:27.097 回答
5
var results = string.match(/(\d+|\D+)/g);

测试:

"aoueoe34243euouoe34432euooue34243".match(/(\d+|\D+)/g)

退货

["aoueoe", "34243", "euouoe", "34432", "euooue", "34243"]
于 2013-06-11T19:19:17.953 回答
1

乔治......我的回答最初与dystroy的相似,但是当我今晚回到家并发现你的评论时,我无法放弃挑战

:)

这里没有正则表达式。fwiw 它可能会更快,这将是一个有趣的基准,因为迭代是原生的。

function p(s){
  var str = "", num = 0;
  s.split("").forEach(function(v){
    if(!isNaN(v)){
        (num = (num||0) + +v);
    } else if(num!==undefined){
        (str += num + v,num = undefined);
    } else {
        str += v;
    }
  });
  return str+(num||"");
};

// TESTING
console.log(p("345abc567"));
// 12abc18
console.log(p("35abc2134mb1234mnbmn-135"));
// 8abc10mb10mnbmn-9
console.log(p("1 d0n't kn0w wh@t 3153 t0 thr0w @t th15 th1n6"));
// 1d0n't0kn0w0wh@t12t0thr0w0@t0th6th1n6

// EXTRY CREDIT
function fn(s){
    var a = p(s);
    return a === s ? a : fn(a);
}

console.log(fn("9599999gh999999999999999h999999999999345"));
// 5gh9h3

这是Fiddle和一个没有过于聪明的三元组的新 Fiddle

于 2013-06-12T04:56:58.307 回答