2014-12-30 139 views
1

我想从一个字符串中使用正则表达式得到一个子字符串,但由于我的正则表达式无法正常工作而出现错误。任何一个可以帮我在写正确的:正则表达式 - Perl

这里是我想写正则表达式的模式:

MSM8_BD_V4.3_1-1_idle-Kr_Run3.xlsx 
MSM8_BD_V4.3_2-6_mp3-Kr_Run2.xlsx 
MSM8_BD_V4.3_Camera_snap-7.xlsx 
MSM8_BD_V4.3_Camera_snap-8.xlsx 
MSM8_BD_V4.3_Radio_202.16-0.xlsx

我试图让子的加粗部分。下面

的正则表达式我想:

my $line = "MSM8939_BD_V4.3_1-1_idle-Kratos_Run3.xlsx"; 
my ($captured) = $line =~ /MSM8939_BD_V4\.\3\_[d]*(.+?)\w/gx; 
print "$captured\n"; 

回答

2

[d]只是字面信d匹配。你想要\d,没有括号,以匹配一个数字。但是,它看起来像你也想包括下划线。那将是[\d_]

试试这个:

/^MSM8_BD_V4\.3_[\d_]*-?([^-]+)/ 

如果我对你的投入运行这个(如与perl -nE 'say $1 if /^MSM8_BD_V4\.3_[\d_]*-?([^-]+)/'),我得到这样的输出:

1_idle 
6_mp3 
Camera_snap 
Camera_snap 
Radio_202.16 
+0

仍然没有工作:( – user1362796

+0

能否请你帮我写完整的正则表达式 – user1362796

+0

@ user1362796:看到我的编辑 –

0
my $line = "MSM8939_BD_V4.3_1-1_idle-Kratos_Run3.xlsx"; 

for (qw(
    MSM8939_BD_V4.3_1-1_idle-Kratos_Run3.xlsx 
    MSM8939_BD_V4.3_2-6_mp3-Kratos_Run2.xlsx 
    MSM8939_BD_V4.3_Camera_snap-7.xlsx 
    MSM8939_BD_V4.3_Camera_snap-8.xlsx 
    MSM8939_BD_V4.3_Radio_202.16-0.xlsx 
)) { 
    my ($captured) = ($_ =~ /.*[-_]([^\W_]+_[\w.]+)-/gx); 
    print "$captured\n"; 
} 

使用贪婪模式尽可能去尽可能,然后抓住最后两个字符串,看起来像你想要的,仍然是连字符。

一样,而我打字这是刚才编辑的其他答案,这将产生:

1_idle 
6_mp3 
Camera_snap 
Camera_snap 
Radio_202.16 

这一次可能是在更一般的子字符串的开头并不硬编码,也就是说,你可以在其他不一定以MSM8_BD_V4.3开头的情况下使用。

+1

感谢Joseph的快速帮助!! – user1362796

+0

不客气!如果你在很多数据上运行它,并且稍后会出于某种原因需要匹配不同的数据模式,也显示出来,你需要适应正则表达式,随时再问。 –