Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript按正则表达式拆分字符串_Javascript_Regex_Split - Fatal编程技术网

JavaScript按正则表达式拆分字符串

JavaScript按正则表达式拆分字符串,javascript,regex,split,Javascript,Regex,Split,我将有一个长度不超过8个字符的字符串,例如: // represented as array to demonstrate multiple examples var strs = [ '11111111', '1RBN4', '12B5' ] 当运行函数时,我希望所有数字字符相加以返回最终字符串: var strsAfterFunction = [ '8', '1RBN4', '3B5' ] 您可以看到第一个字符串中的所有8个1字符都

我将有一个长度不超过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
=>
27
234
=>
9
您可以对整个转换执行此操作:

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”]

测试:

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

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

乔治。。。我的回答本来和戴斯特罗伊的很相似,但当我今晚回到家发现你的评论时,我无法拒绝挑战

:)

这里没有regexp。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

这是没有太聪明的三元数的&a

字符串“999”应该是“27”还是“9”,我必须使用regexp吗?@MarshallAnschutz已经回答了你的问题-总是求和digits@Shanimal不一定要使用regexp-我认为这将是最好的。如果您有合适的替代品,请提供!。。但是@dystroy已经从中获得了全部乐趣,并为您提供了整个算法:)为什么您不使用
if(){}else{}
?这不是使用第三级运算符的适当方式。你可能会认为它看起来很圆滑,但只有少数程序员一眼就能看懂。@KthProg我想几乎所有看过三元体的人都能看懂它。当然,读起来不好看,但我不会说这是一个大问题。@Nit我只是不想成为维护代码的人。@KthProg。。。是的,这就是写代码可维护性这本书的人所说的“过于聪明”。我会编辑这篇文章并把它清理干净。完美!!。这不是我的问题,但这个解决方案基本上拯救了生命。。。
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