Regex 使perl中的正则表达式对具有不同结尾的字符串执行grep值
我用perl编写了这段代码,其中我想提取Regex 使perl中的正则表达式对具有不同结尾的字符串执行grep值,regex,perl,Regex,Perl,我用perl编写了这段代码,其中我想提取'EUR\u AF'的值,在本例中是'0.39'。 有时,'EUR_AF'以'结尾,有时它不会。 或者,'EUR_AF'可以以'=0'结尾,而不是'=0.39;'或'=0.39' 我如何让代码处理这个问题?似乎在网上找不到……我当然可以用一个几乎无休止的if-elsif-else语句来包装一切,但这似乎有些过分了 示例文本: AVGPOST=0.9092;AN=2184;RSQ=0.5988;速率=0.0081;AC=144;VT=SNP;θ=0.0045
'EUR\u AF'
的值,在本例中是'0.39'
。
有时,'EUR_AF'
以'结尾代码>,有时它不会。
或者,'EUR_AF'
可以以'=0'
结尾,而不是'=0.39;'代码>或'=0.39'
我如何让代码处理这个问题?似乎在网上找不到……我当然可以用一个几乎无休止的if-elsif-else语句来包装一切,但这似乎有些过分了
示例文本:
AVGPOST=0.9092;AN=2184;RSQ=0.5988;速率=0.0081;AC=144;VT=SNP;θ=0.0045;AA=A;SNPSOURCE=低cov;LDAF=0.0959;AF=0.07;ASN_AF=0.05;AMR_AF=0.10;AFR_AF=0.11;欧元AF=0.039
代码:$INFO=~m/\;欧元\\u AF \=(.*)/
我确实发现:$INFO=~m/\;EUR\\u AF\=(.*0)/
处理EUR\\u AF=0
的情况,但如何有效处理替代方案?我找到了答案。守则:
$INFO=~m/(?:^ |)EUR_AF=([^;]*)/
似乎可以处理EUR_AF=0
和EUR_AF=0.39
,以结尾或不以结尾的情况代码>。生成的$INFO
将是0
或0.39
此正则表达式应该适用于您:(?提取一个值:
my ($eur_af) = $s =~ /(?:^|;)EUR_AF=([^;]*)/;
提取所有值:
my %rec = split(/[=;]/, $s);
my $eur_af = $rec{EUR_AF};
您可以使用;
使成为可选的?
或使用?
使0
成为可选的。或者,您可以在=
之后提取所有数字。例如欧元AF=[0-9]+(?:\.[0-9]+)?
必须更简单:欧元AF=\d+(\.\d+)
,不必要的查找只会减慢速度。(…)?
没有任何意义。我想你的意思是(?:…)?
。说到捕获,缺少正确的捕获。最后(?实际上EUR\u AF=\d+(\。\d+)?
不是一个解决方案,因为你最终会得到.039
,或者在EUR_AF=1.00
的情况下,得到.00
@SanderW.vanderLaan,我说的是整个正则表达式结果,而不仅仅是第一个捕获组。在这种情况下,它会返回正确的结果。@ikegami the(…)?
是正确的,正如OP提供的示例一样,可能会出现0.45或0没有任何数字的情况,因为comaI认为您想要my%rec=split/[=;]/,$s;
——即没有限制。@SinanÜnür,实际上,我是要map{split(/=,$,2)}split/;/,$s
,但我最初使用的简单解决方案应该足够好了。最好的解决方案是/(?:^ |)EUR_AF=([^;]*)/
因为它也会正确处理1.00
或0.039
的情况;答案将是1.00
或0.039
,而不是0
或.039
。谢谢!换句话说,不管是什么,它都会得到整个字段。我也同意这是正确的方法(也许很明显).如果要进行任何验证,则应在之后独立进行。
my %rec = split(/[=;]/, $s);
my $eur_af = $rec{EUR_AF};