perl 我如何用正则表达式捕获两组特定的双下划线之间的字符串?

lb3vh1jj  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(156)

我想用正则表达式捕获两组特定的双下划线之间的字符串。捕获的字符串本身可能有一个下划线。下面是我一直在使用的测试Perl脚本:

#!/usr/bin/env perl
use strict;

my $str = "DFD_20220913_121409_strix1a0__z1_erx_adm__CL1695331__RTL_Dfdsg4__regression__df_umc_nbio_hubs_gfx__220913_150718";
(my $grp) = $str =~ /CL\d+\_\_(\w+)\_\_/;
print "grp = $grp\n";

exit;

这会传回...

grp = RTL_Dfdsg4__regression__df_umc_nbio_hubs_gfx

我想要...

grp = RTL_Dfdsg4

正如您所看到的,我知道第一组双下划线的位置(在CL\d+之后),但是由于某种原因,regexp读取下一个双下划线,直到它遇到最后一组双下划线。

g6baxovj

g6baxovj1#

您需要使用非贪婪量词?

(my $grp) = $str =~ /CL\d+__(\w+?)__/;

我删除了下划线前面不必要的反斜杠。

ffvjumwh

ffvjumwh2#

请注意,使用non-greedy修饰符是脆弱的,很容易产生与预期不同的效果。这是一个健壮的替代方法:

my ( $grp ) = $str =~ /
   CL \d+
   __ 
   ( [^\W_]+ (?: _ [^\W_]+ )* )     # `[^\W_]` is `\w` minus `_`
   __
/x;

相关问题