Javascript 中的正则表达式:要保存的组数未知
RegEx in Javascript: unknown number of groups to save
我有以下 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] 中.
输出稿
想法一:
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
有什么想法是我为了获得上述输出而遗漏的吗?
如果我这样做,我会把正则表达式分成两部分——一个用于前两个数字,一个用于数据——以便后期更容易理解。类似于:
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)
从这里开始,如果您需要进一步处理,例如根据您的数据制作对象数组,应该很容易。
// array of objects like [{'73108': '[G]'}, ...]
let objArray = data.map(n => {
let [key, value] = n.split(':')
return {[key]:value}
})
我有以下 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] 中.
输出稿
想法一:
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
有什么想法是我为了获得上述输出而遗漏的吗?
如果我这样做,我会把正则表达式分成两部分——一个用于前两个数字,一个用于数据——以便后期更容易理解。类似于:
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)
从这里开始,如果您需要进一步处理,例如根据您的数据制作对象数组,应该很容易。
// array of objects like [{'73108': '[G]'}, ...]
let objArray = data.map(n => {
let [key, value] = n.split(':')
return {[key]:value}
})