Regex 使perl中的正则表达式对具有不同结尾的字符串执行grep值

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

我用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;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};