2014-12-30 176 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

不客氣!如果你在很多數據上運行它,並且稍後會出於某種原因需要匹配不同的數據模式,也顯示出來,你需要適應正則表達式,隨時再問。 –