2013-06-11 119 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

相關問題