JavaScript正则表达式分割字符串

5

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

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

当通过函数运行时,我希望所有数字字符被加起来以返回一个最终字符串:

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

您可以看到第一个字符串中所有的8个单独的“1”字符最终变成了一个单独的“8”字符字符串,第二个字符串保持不变,因为在任何时候都没有相邻的数字字符,第三个字符串会发生变化,因为“1”和“2”字符变成了“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操作,例如:

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

编辑:

问题: 关于字符串"999",结果应该是"27"还是"9"?

如果清楚了,总是对数字求和,999 => 27234 => 9


5
对于字符串"999",结果应该是"27"还是"9"? - Marshall Anschutz
我必须使用正则表达式吗? - Shanimal
@MarshallAnschutz已经回答了你的问题 - 总是将数字求和 - Harry
@Shanimal 不一定非要使用正则表达式 - 我认为这是最好的选择。如果您有更合适的替代方案,请提供! - Harry
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"]


完美!这不是我的确切问题,但这个解决方案基本上拯救了生命... - Kermit_ice_tea

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

测试:

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

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

2
但是@dystroy已经把所有的乐趣都带走了,并为你提供了整个算法 :) - mzedeler

1

我原本的回答和dystroy的相似,但今晚回家看到你的评论后,我不能错过这个挑战。

这里是没有正则表达式的版本。就算速度更快,也可能是一个有趣的基准测试,因为迭代是本地的。

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


为什么不直接使用 if () { } else { } 呢?这不是使用三元运算符的适当方式。你可能认为它看起来很酷,但只有少数程序员能一眼看懂。 - KthProg
1
@KthProg 我认为几乎任何看过三元运算符的人都可以很好地阅读它。当然,它不太美观,但我不会称之为一个巨大的问题。 - Etheryte
@Nit 我只是讨厌成为维护那段代码的人。 - KthProg
@KthProg...是的,那些写代码可维护性书籍的人称之为“过于聪明”。我会编辑帖子并清理它。 - Shanimal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接