JavaScript通过正则表达式拆分字符串

时间:2013-06-11 19:14:11

标签: javascript regex split

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

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

当浏览函数时,我希望将所有数字字符相加以返回最终字符串:

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

在这里你可以看到第一个字符串中的所有8个单1个字符最终都是一个8个字符串,第二个字符串保持不变,因为没有相邻的数字字符和第三个字符串会随着12字符变为3而其他字符串不变而更改。

我认为在伪代码中执行此操作的最佳方法是:

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正则表达式将被多个adajcent数字字符分割,例如:

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

编辑:

问题: 字符串“999”应该是“27”或“9”

如果清楚,请始终对数字进行SUM,999 => 27234 => 9

3 个答案:

答案 0 :(得分: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"]

答案 1 :(得分:5)

var results = string.match(/(\d+|\D+)/g);

测试:

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

返回

["aoueoe", "34243", "euouoe", "34432", "euooue", "34243"]

答案 2 :(得分:1)

乔治......我的答案最初类似于dystroy's,但是当我今晚回到家并找到你的评论后,我无法提出挑战

:)

这里没有正则表达式。 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&一个new Fiddle没有过于聪明的三元