Perl正则如何精准捕获两组特定双下划线间的目标字符串?
Perl正则捕获双下划线间指定内容的问题解决
你的问题是用正则捕获CL\d+__之后第一组双下划线之间的字符串,但原正则因为贪婪匹配,抓到了最后一组双下划线前的内容。下面给你两种解决办法:
方法1:使用非贪婪匹配
原正则里的\w+是贪婪模式,会尽可能多匹配字符(包括单下划线),直到遇到最后一个__才停止。把它改成非贪婪的\w+?,就会匹配到第一个__就终止:
my $target_str = "DFD_20220913_121409_strix1a0__z1_erx_adm__CL1695331__RTL_Dfdsg4__regression__df_umc_nbio_hubs_gfx__220913_150718"; if ($target_str =~ /CL\d+__(\w+?)__/) { print "捕获结果:$1\n"; # 输出 RTL_Dfdsg4 }
方法2:使用否定前瞻的字符匹配
如果需要更精确控制(比如中间可能出现非\w的字符),可以用否定前瞻来匹配不包含双下划线的内容:
my $target_str = "DFD_20220913_121409_strix1a0__z1_erx_adm__CL1695331__RTL_Dfdsg4__regression__df_umc_nbio_hubs_gfx__220913_150718"; if ($target_str =~ /CL\d+__((?:(?!__).)+)__/) { print "捕获结果:$1\n"; # 输出 RTL_Dfdsg4 }
这里(?:(?!__).)+表示:循环匹配单个字符,只要这个字符不是__的开头,直到遇到__为止。
内容的提问来源于stack exchange,提问作者David Gauthier
相关产品推荐
相关产品推荐

