Javascript中的RegEx:要保存的未知数量的组

时间:2018-04-04 15:28:13

标签: javascript regex regular-language

我有以下tsv文件,我正在尝试阅读并单独保存信息。

这里有两行文件的例子:

文件摘录

13->7   3   270296:[T]1132070:[T]2807979:[T]
12->8   31  73108:[G]119227:[T]210429:[T]237902:[T]490699:[A]588160:[T]730687:[A]863532:[T]953590:[T]1207654:[T]1270425:[C]1315919:[C]1374547:[C]1787551:[C]1872033:[G]1963836:[T]2112830:[A]2183936:[A]2464064:[T]2573449:[T]2594098:[T]2667677:[C]2815676:[T]2926565:[T]3019188:[T]3023991:[A]3097403:[A]3142179:[A]3180137:[C]3254219:[G]3265026:[G]

如您所见,每一行都有不同数量的最后一组。我尝试了以下代码,但它只保存了第一组:

代码草稿:

var x = str.split('\n');
var regex = /([0-9]+)\t([0-9]+)\t(([0-9]+):.([ACGTN]).)+/g;
for (var i=0; i<x.length; i++) {
    line = regex.exec(x[i]);
    console.log(line);
    //Example for the first line
    //line[1] = 7
    //line[2] = 3
    //line[3] = 270296:[T]
    //line[4] = 270296
    //line[5] = T
    //that's it
}

我的预期输出是每个NUM:[LETTER]一起出现在数组的单元格中(如行[3]中)或已经分开,如行[4]和行[5]。 / p>

输出草稿

创意1:

line[3] = 270296:[T]
line[4] = 1132070:[T]
line[5] = 2807979:[T]

创意2

line[3] = 270296
line[4] = T
line[5] = 1132070
line[3] = T
line[4] = 2807979
line[5] = T

为了获得这个提到的输出,我有什么想法?

1 个答案:

答案 0 :(得分:1)

如果我这样做,我会将正则表达式分为两部分 - 一部分用于前两个数字,一部分用于数据 - 以便于后期更容易理解。类似的东西:

&#13;
&#13;
var line = '8  31  73108:[G]119227:[T]210429:[T]237902:[T]490699:[A]588160:[T]730687:[A]863532:[T]953590:[T]1207654:[T]1270425:[C]1315919:[C]1374547:[C]1787551:[C]1872033:[G]1963836:[T]2112830:[A]2183936:[A]2464064:[T]2573449:[T]2594098:[T]2667677:[C]2815676:[T]2926565:[T]3019188:[T]3023991:[A]3097403:[A]3142179:[A]3180137:[C]3254219:[G]3265026:[G]'

// get the numers and the rest
let [num1, num2, data] = line.split(/\s+/g)

// parse the rest to an array
data = data.match(/([0-9]+:\[[ACGTN]\])/g)

console.log(num1, num2, data)
&#13;
&#13;
&#13;

如果你需要进一步处理,例如从你的数据中创建一个对象数组,那么从这里开始就应该很容易。

// array of objects like [{'73108': '[G]'}, ...]
let objArray = data.map(n => {
    let [key, value] = n.split(':')
    return {[key]:value}
})