2013-06-11 2 views
5

avrò una stringa mai lungo di 8 caratteri, ad esempio:JavaScript spaccatura stringa regex

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

Quando correva attraverso una funzione, vorrei tutti i caratteri numerici per essere sommati per restituire una stringa finale :

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

Dove è possibile leggere tutte le 8 singole 1 caratteri della prima stringa finiscono come una singola stringa di caratteri 8, la seconda stringa rimane invariata in nessun punto sono là caratteri numerici adiacenti e terza corda cambia come 1 e 2 caratteri diventano 3 e il resto della stringa è invariato.

Credo che il modo migliore per farlo, in pseudo-codice, sarebbe:

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 

quale sarebbe il .split regex per raggruppati per più caratteri adajcent cifre, ad esempio:

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

EDIT:

domanda: cosa circa la stringa "999" dovrebbe essere il risultato "27", o "9"

Se era chiaro, SUM sempre le cifre, 999 =>27, 234 =>9

+5

cosa circa la stringa "999" dovrebbe il risultato essere "27", o "9" –

+0

devo usare un'espressione regolare? – Shanimal

+0

@MarshallAnschutz hanno risposto alla tua domanda - sempre SUM le cifre – Harry

risposta

12

Si può fare questo per tutta la trasformazione:

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

Per la vostra strs array, restituisce ["8", "1RBN4", "3B5"] .

+1

questa è la perfezione – Harry

+0

eccellente !!. Questo non era il mio problema esatto, ma questa soluzione in pratica ha salvato delle vite ... –

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

Testing:

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

Returns

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

.. ma @dystroy ha preso tutto il divertimento e ha fornito l'intero algoritmo per te :) – mzedeler

1

George ... La mia risposta è stata originariamente simile a dystroy di, ma quando sono tornato a casa stasera e ho trovato il tuo commento non ho potuto passare una sfida

:)

Eccolo senza regexp. perché potrebbe essere più veloce, sarebbe un punto di riferimento interessante dal momento che le iterazioni sono native.

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 

e qui è il Fiddle & un new Fiddle senza troppo intelligente ternario

+0

Perché non dovresti semplicemente usare 'if() {} else {}'? Questo non è il modo appropriato di usare un operatore terziario. Si potrebbe pensare che sembri liscio, ma solo alcuni programmatori lo otterranno a prima vista. – KthProg

+1

@KthProg Penso che chiunque abbia visto un ternario prima possa leggerlo bene. Certo, non è bello da leggere ma non lo definirei un problema enorme. – Nit

+0

@Nit Vorrei solo odiare essere il ragazzo che mantiene quel codice. – KthProg