【问题标题】:Parse value using Regex [duplicate]使用正则表达式解析值 [重复]
【发布时间】:2015-07-16 19:53:52
【问题描述】:

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

【问题讨论】:

  • 你使用什么语言?
  • 为什么必须在一个正则表达式中完成?我宁愿提取FAO=; 之间的字符串并将其拆分为, 标记。
  • 此时不是特定于语言的问题,我只想解析标准正则表达式。我可以编写代码来执行此操作,但这无济于事,因为应用程序的性质要求输入有效的正则表达式和匹配器组的用户进行处理。

标签: regex


【解决方案1】:

你可以使用这样的正则表达式

FAO=([0-9]+(,[0-9]+)*);

外括号允许您提取具有第一个匹配组的一个或多个值。

编辑

考虑到您想使用不同的匹配组捕获单个值,这种方法将不起作用(在 * 中捕获组只会捕获最后一个匹配项)。请参阅this question 接受的答案以获取解决方案。

编辑 2

请参阅基于该答案的this demo,以获取将每个数字与相同捕获组匹配的 pcre 正则表达式示例。

(?:FAO=|\G,)\K(\d+)

请注意,并非所有正则表达式都支持 \G 和 \K。 \G 匹配上一个匹配的结尾(或字符串的开头),\K 重置当前匹配的开头。

【讨论】:

  • 我没有关注链接问题的答案如何解决这个问题?
  • @Brent 请参阅我的回答中的 EDIT 2。
【解决方案2】:

您可以使用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 中所述,在大多数语言中不可能有任意数量的组匹配。

【讨论】:

  • 问题是我需要匹配器组来匹配数字。我无法为此应用程序使用其他代码来执行此操作。
  • @Brent 在大多数语言中不可能有任意数量的组匹配。请参阅指出这一点的可能重复问题:stackoverflow.com/questions/3537878/…
  • 谢谢!我认为这可以解决问题...不可能做我想做的事:-(
猜你喜欢
  • 2015-01-29
  • 2018-04-29
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 2011-01-23
  • 2012-11-21
  • 2014-10-28
相关资源
最近更新 更多