2013-07-25 45 views
1

我試圖從任一下列格式字符串通號:這個Java正則表達式爲什麼不編譯?

PassID_132 
PassID_64 
Pass_298 
Pass_16 

對於這一點,我構建了以下的正則表達式:

Pass[I]?[D]?_([\d]{2,3}) 

- 和在Eclipse中的搜索對話框進行了測試。它運行良好。

但是,當我在代碼中使用它時,它不匹配任何東西。這裏是我的代碼片段:

String idString = filename.replaceAll("Pass[I]?[D]?_([\\d]{2,3})", "$1"); 
int result = Integer.parseInt(idString); 

我也試過

java.util.regex.Pattern.compile("Pass[I]?[D]?_([\\d]{2,3})") 
表達式

窗口在調試時,卻寫着 「」,而

java.util.regex.Pattern.compile("Pass[I]?[D]?_([0-9]{2,3})") 

編譯,但是沒」不匹配任何東西。可能是什麼問題呢? ?

+1

「\\ d」已經擴展爲「[0-9]」了,不要把它放在括號裏!您也可以將單個字母(如「I」或「D」)的括號轉儲。嘗試「通過(?:ID)?_(\\ d {2,3})」 – AKDADEVIL

回答

1

沒有什麼無效你tegex,但它吮吸。你不需要圍繞單個字符項的字符類。試試這個:

"Pass(?:ID)?_(\\d{2,3})" 
+0

謝謝。我的問題實際上並不是我的正則表達式不匹配,而是它沒有覆蓋整個字符串,即在正則表達式匹配的部分之前和之後存在更多不相關的文本,這些文本未被刪除。 –

2

相反通行證[I] [d] _的([\ d] {2,3})試試這個:

Pass(?:I)?(?:D)?_([\d]{2,3}) 
+0

請注意,他也會匹配「PassD_123」或「PassI_321」 – Ingo

+0

正確,我的正則表達式也是如此,但我可以負擔得起。只有Pass_和PassID_會出現。 –

+0

仍然獲得數字部分。我只是遵循回答者試圖使「I」和「D」可選的問題中遵循的模式 – morgano

相關問題