2016-10-25 211 views
-1

我有一個正在循環的字符串數組(例如下面),我需要能夠獲取最後一個ID和名稱。如何根據字符被分割的字符兩邊分割字符串

/18264:Blues (all)/19307:Acoustic Blues 
/18264:Blues (all)/19308:Blues 
/18267:Dance/Electronica 

從上面的例子,我要做到這一點:

id: 19307 
name: Acoustic Blues 

id: 19308 
name: Blues 

id: 18267 
name: Dance/Electronica 

所以它得到的最後一個ID和名稱,但是我有一個包含了在他們斜線名稱問題(IE舞曲/電子樂)有沒有辦法忽略這個斜線?我的代碼如下(示例):

angular.forEach(obj, function(val, key) { 
    // /18264:Blues (all)/19307:Acoustic Blues 
    var str = key.split('/').pop(); 
    // 19307 
    var id = str.split(':')[0]; 
    // Acoustic Blues 
    var name = str.split(':')[1]; 

    newObj.push({ 'id': id, 'name': name }); 
} 

讓我知道您的想法!

卡爾

回答

3

這是正則表達式可以幫助的情況下 - 他們專爲匹配字符串模式,比如這個。對於這個問題,你可以使用下面的正則表達式:

\/(\d+):([^:]*)$ 

這是由:

  • \/ - 轉義/ - 起始斜線
  • (\d+) - 至少一個數字,裏面一個捕獲組,捕獲ID
  • : - 字面上冒號
  • ([^:]*) - 捕獲組在尋找什麼其他不是一個冒號,捕捉名字
  • $ - 字符串的結尾

要在代碼中使用這個,你可以這樣做如下:

angular.forEach(obj, function(val, key) { 
    //note the extra/at the start and end, denoting this as a regular expression 
    //in javascript 
    var result = /\/(\d+):([^:]*)$/.exec(key); 
    var id = result[1]; 
    var name = result[2]; 

    newObj.push({ 'id': id, 'name': name }); 
} 

result是一個數組,其中索引1和2對應於正則表達式中的捕獲組。

要了解正在發生的事情以及更多正則表達式的細節,有許多在線工具(如regex101.com)可以提供幫助。

+0

驚人,感謝深入的解釋 - 看起來像我會需要對自己進入一些正則表達式!工作完美,再次感謝。 – CarlTaylor1989

1

這個怎麼樣?

var lines = ["/18264:Blues (all)/19307:Acoustic Blues", "/18264:Blues (all)/19308:Blues", "/18267:Dance/Electronica"]; 
 

 
var newObj = []; 
 
for (var i = 0; i < lines.length; ++i) { 
 
    var line = lines[i].split(/:/); 
 
    newObj.push({"id" : line[line.length - 2].split(/\//)[1], "name" : line.slice(-1)[0]}); 
 
} 
 

 
console.log(newObj);