特定字符后的不同长度的子串

时间:2014-08-28 19:50:34

标签: javascript string substring

我正在尝试抓取部分字符串看起来像“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等等。

2 个答案:

答案 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

FIDDLE