2013-03-08 26 views
0

匹配我做的模式匹配下面一些名字:模式在Perl

ABCD123_HH1 
ABCD123_HH1_K 

現在,我的代碼到grep上面的名字是如下:

($name, $kind) = $dirname =~ /ABCD(\d+)\w*_([\w\d]+)/; 

現在,我面臨的問題是,我得到,ABCD123_HH1_K$dirname這兩種模式。但是,我的變量$kind不包含此ABCD123_HH1_K。它確實需要ABCD123_HH1模式。

欣賞你的時間。你能告訴我可以做些什麼來獲得與_k模式。

回答

4

您需要的_K部件添加到您的正則表達式的結尾,使其可選的?

/ABCD(\d+)_([\w\d]+(_K)?)/ 

我也抹去了\w*,這是無用的,讓你正確地獲取HH1_K

+0

那豈不是更好地使用'(_K)'而不是'(_K)*'避免匹配'_K'的多個實例? (根據OP的需求,我猜)。 – 2013-03-08 19:16:32

+0

@PhilipKendall據我瞭解,他的字符串有「_K」或者沒有,所以我認爲它沒有改變任何東西。無論如何,你的解決方案會更好,但我會編輯:) – alestanis 2013-03-08 19:17:23

+0

謝謝你alestanis和philip。所以,我應該添加我的代碼如下:($ name,$ kind)= $ dirname =〜/ ABCD(\ d +)\ w * _([\ w \ d] +)(_ K)/;讓我試試btw我是「她」:) – user1985039 2013-03-08 19:20:33

1

您應該檢查零次或多次出現_K

*在Perl的正則表達式表示零次或多次

+意味着ATLEAST一次或多次。

因此在您的正則表達式中,附加(_K)*

最後,你的正則表達式應該是這樣的:

/ABCD(\d+)\w*_([\w\d]+(_K)*)/ 
+0

嗨,它仍然沒有采取...我打印$種,它不顯示模式與_K變量。 :( – user1985039 2013-03-08 19:32:33

+0

我想$ kind打印整個東西像「HH1_K」和$名稱爲「ABCD123」 – user1985039 2013-03-08 19:36:55

+0

@ user1985039請發佈您的更新代碼 – 2013-03-08 19:42:02

0

\w包含字母,數字以及下劃線。

所以,你可以用這樣簡單的東西: /ABCD\w+/

+0

不,它掏出了甚至打印的一個......我會試試謝謝你:) – user1985039 2013-03-08 19:50:36