我正在尝试抓取部分字符串看起来像“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 :(得分: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!')
然后你可以将它放入一个函数中并将所需的类别作为参数。扩展功能
答案 1 :(得分: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