2013-06-11 67 views
5

我将有一个字符串的长度不会漫长超过8个字符,如:JavaScript的分割字符串的正则表达式

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

如果是明确的,始终总和数字,999 =>27234 =>9

+5

什么字符串“999”应该的结果是“27”或“9” –

+0

我必须使用正规? – Shanimal

+0

@MarshallAnschutz已回答你的问题 - 总是SUM数字 – Harry

回答

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

这是极好的 – Harry

+0

完美!!。这不是我确切的问题,但这种解决方案基本上挽救了生命...... –

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 [email protected] 3153 t0 thr0w @t th15 th1n6")); 
// 1d0n'[email protected]@t0th6th1n6 

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

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

这里是Fiddle &一个new Fiddle没有过于聪明三元

+0

为什么你不只是使用'if(){} else {}'?这不是使用高等运营商的适当方式。你可能会认为它看起来很光滑,但只有少数程序员会第一眼看到它。 – KthProg

+1

@KthProg我认为几乎所有看过三元组的人都可以阅读它。当然,阅读并不美妙,但我不会说这是一个巨大的问题。 – Nit

+0

@Nit我只是讨厌成为维护代码的人。 – KthProg

相关问题