2014-08-28 35 views
0

我试图去抓,看起来像一个字符串的一部分“A_1234_5678,B_2345_678,C_3456_78”在列表项的第一部分是一个类别,并在第一后的部分下划线是我需要的某种形式的数据(3456_78或3456 78)。子串的特定字符后不同长度的

他们总是在相同的顺序,但并不总是存在。 例如,它也可以看起来像“A_1234_5678,C_3456_7890”。但是让我们假设我需要C_后的数据。它始终是相同的顺序,但并不总是列表中的相同索引。而且,数据并不总是相同的长度。所以数据的长度是不一样的,它的起始索引也不相同。

有没有办法做到这一点?最好是javascript,所以我可以在<script>的网站中使用它。我看了split,substr,并尝试过indexOf等。

回答

0

当然。我会使用正则表达式来消化。

var stringToParse = 'C_3456_7890'; 
var returnArray = stringToParse .match(/^([A-Z])_([0-9_]*)$/); 

这将在数组的索引1的类别信,并在索引2的数据应该只要类别总是一个大写字母和指数只有数字和下划线的工作。如果你让我知道更多有关可能的选项,我可以更新我的回应

编辑

,以帮助一个以上的项目列表中,你应该把它拆分的逗号第一

var stringToTest = "A_1234_5678, B_2345_678, C_3456_78" 
var arrayOfStrings = stringToTest.split(',') 
for (var i = 0; i<arrayOfStrings.length; i++){ 
    var returnArray = arrayOfStrings[i].match(/^\s*([A-Z])_([0-9_]*)\s*$/); 
    console.log(returnArray); 
} 

用您需要用来处理数据和类别的任何代码替换控制台日志,您将会很好。

第二编辑

代码的建议,在循环使用:

if (returnArray[1] == 'C'){ 
    var foundData = returnArray[2]; 
    break; 
} 

所以完整的代码会看起来像

var stringToTest = "A_1234_5678, B_2345_678, C_3456_78" 
var arrayOfStrings = stringToTest.split(',') 
var foundData = false; 
for (var i = 0; i<arrayOfStrings.length; i++){ 
    var returnArray = arrayOfStrings[i].match(/^\s*([A-Z])_([0-9_]*)\s*$/); 
    if (returnArray[1] == 'C'){ 
    foundData = returnArray[2]; 
    break; 
    } 
} 
console.log(foundData !== false ? foundData : 'Sorry, no matching index found!') 

然后你可以把这个成函数并将所需的类别作为参数。延伸的功能

0
function getByCategory(data, category) { 
    return data.split(',').map(function(x) { 
     return x.trim(); 
    }).filter(function(y) { 
     return y.indexOf(category) === 0; 
    }).shift().replace(category + '_', ''); 
} 

用作

var data = getByCategory('A_1234_5678, B_2345_678, C_3456_78', 'B'); //2345_678 

FIDDLE

相关问题