2016-10-25 107 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);