我有一个从VCF文件中获取的长字符串,例如(这些文章被截断用于示例目的):
chr1 11189845 COSM462604;COSM893813 G C,T 158.16 PASS AF=0,0;AO=0,0;DP=1201;FAO=0,0;FDP=1201;FR=.;
chr1 11190804 COSM180789 C T 134.06 PASS AF=0;AO=0;DP=1016;FAO=0;FDP=1018;FR=.;FRO=1018;
我想写一个正则表达式来返回给定行上粮农组织的所有价值。
FAO
的有效格式为:FAO=SomeNumber;
或FAO=SomeNumber, SomeNumber, SomeNumber, etc...;
有没有办法编写一个REGEX捕获组,它会考虑单个值和用逗号分隔的无限多个值,直到看到';'
?
我试过
FAO=((([0-9]+);)|(([0-9]+),([0-9])+))
但它只考虑最多2个数字,我需要匹配器组1作为第一个值,匹配器组2作为第二个等...
答案 0 :(得分:1)
你可以使用像这样的正则表达式
FAO=([0-9]+(,[0-9]+)*);
外括号允许您使用第一个匹配组提取一个或多个值。
修改
考虑到您想要使用不同的匹配组捕获单个值,这种方法不会起作用(捕获*内的组只会捕获最后一个匹配)。请参阅this question的已接受答案以获得解决方案。
编辑2
请参阅this demo基于该答案的pcre正则表达式示例,该正则表达式将匹配具有相同捕获组的每个数字。
(?:FAO=|\G,)\K(\d+)
请注意,并非所有正则表达式都支持\ G和\ K. \ G匹配上一个匹配的结尾(或字符串的开头),\ K重置当前匹配的开始。
答案 1 :(得分:1)
您可以使用negated character class:[^;]+
这表示匹配任何不是分号的字符。由于它是一个贪婪的比赛,它将一直持续到它看到第一个分号。
var strings = [
'chr1 11189845 COSM462604;COSM893813 G C,T 158.16 PASS AF=0,0;AO=0,0;DP=1201;FAO=0,0;FDP=1201;FR=.;',
'chr1 11190804 COSM180789 C T 134.06 PASS AF=0;AO=0;DP=1016;FAO=0;FDP=1018;FR=.;FRO=1018;'
];
strings.forEach(function(str) {
alert(str.match(/(FAO=[^;]+)/)[1]);
});

从那里你可以编辑组匹配只捕获值/FAO=([^;]+)/
,然后你可以在逗号分隔符上拆分该值。
var strings = [
'chr1 11189845 COSM462604;COSM893813 G C,T 158.16 PASS AF=0,0;AO=0,0;DP=1201;FAO=0,0;FDP=1201;FR=.;',
'chr1 11190804 COSM180789 C T 134.06 PASS AF=0;AO=0;DP=1016;FAO=0;FDP=1018;FR=.;FRO=1018;'
];
strings.forEach(function(str) {
alert(str.match(/FAO=([^;]+)/)[1].split(','));
});

正如本SO answer所述,大多数语言都无法拥有任意数量的群组匹配。