2013-06-11 10 views
5

będę mieć ciąg nigdy długo niż 8 znaków, np:JavaScript podzielonego ciąg przez regex

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

Gdy przebiegł funkcji, chciałbym wszystkich znaków numerycznych należy zsumować, aby powrócić ostateczną ciąg :

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

gdzie można zobaczyć wszystkie 8 pojedynczych 1 znaków w pierwszym ciągiem skończyć jako jeden 8 ciąg znaków, drugi ciąg pozostaje niezmieniony w żadnym punkcie nie są tam sąsiednie znaki cyfrowe i trzeci ciąg zmienia się jako 1 i 2 znaków stają się 3, a reszta łańcucha pozostaje niezmieniona.

wierzę, że najlepszym sposobem, aby to zrobić, w pseudo-kodzie, byłoby:

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 

Jaki byłby .split regex podzielić przez wielu adajcent znaków numerycznych, np:

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

EDIT:

pytanie: Co napisu "999" powinien być wynikiem "27" lub "9"

Gdyby to było jasne, zawsze zsumować cyfry, 999 =>27, 234 =>9

+5

Co napis „999” powinien wynikiem będzie „27” lub „9” –

+0

muszę użyć wyrażenia regularnego? – Shanimal

+0

@MarshallAnschutz odpowiedział na twoje pytanie - zawsze SUM cyfry – Harry

Odpowiedz

12

Można to zrobić dla całej transformacji:

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

Dla macierzy strs, zwraca ["8", "1RBN4", "3B5"] .

+1

to jest doskonała – Harry

+0

doskonałość !!. To nie był mój dokładny problem, ale to rozwiązanie zasadniczo uratowało życie ... –

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

Testowanie:

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

Zwraca

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

.. ale @dystroy zabrał całą zabawę i dostarczył ci cały algorytm :) – mzedeler

1

George ... Moja odpowiedź była pierwotnie podobny do dystroy, ale kiedy wróciłem do domu wieczorem i okazało komentarz nie mogłem Podnieś wyzwanie

:)

Tutaj jest bez wyrażeń regularnych. fwiw może być szybszy, byłby to interesujący test porównawczy, ponieważ iteracje są rodzime.

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 

i tutaj jest Fiddle & new Fiddle bez zbyt mądry trójargumentowy

+0

Dlaczego nie używałbyś po prostu 'if() {} else {}'? To nie jest właściwy sposób na użycie operatora trzeciego stopnia. Można by pomyśleć, że wygląda zgrabnie, ale tylko kilku programistów dostanie to na pierwszy rzut oka. – KthProg

+1

@KthProg Myślę, że prawie każdy, kto widział trójskładnik przed może przeczytać to dobrze. Oczywiście, nie jest to łatwe do przeczytania, ale nie nazwałbym tego wielkim problemem. – Nit

+0

@Nit Po prostu nienawidziłbym być facetem utrzymującym ten kod. – KthProg

Powiązane problemy