使用Regex解析值

时间:2015-05-06 15:13:04

标签: regex

我有一个从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作为第二个等...

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所述,大多数语言都无法拥有任意数量的群组匹配。