2013-07-16 45 views
1

我遇到了Java中正則表達式的問題。我測試了我的正則表達式,它似乎很好匹配,但其中一個組返回一個空值。它能夠找到正確的組數,但我無法理解爲什麼第二個序列似乎開始並以錯誤的索引結束。Java正則表達式:查找返回true,但其中一個組()無法返回值

模式:

^http\://[\w\-\.]+\.[a-zA-Z]{2}/[\w]{2}/[\w\-]+/(uvw_)+([a-zA-Z0-9]?)+([\w\-]*)$ 

數據來進行測試:

http://www.testing.ca/en/ABC-DEF/uvw_XY5114_2-Z_1_54321 

尋找:XY5114

這裏是regexplanet截圖: Test Results here

編輯:我這由我們工作荷蘭國際集團下面的模式:

^http\://[\w\-\.]+\.[a-zA-Z]{2}/[\w]{2}/[\w\-]+/(uvw_)+([a-zA-Z0-9]*)([\w\-]*)$ 

而另一種選擇建議:

^http\://[\w\-\.]+\.[a-zA-Z]{2}/[\w]{2}/[\w\-]+/(uvw_)+([a-zA-Z0-9]+)([\w\-]*)$ 
+1

爲什麼不使用URI來首先將URL分解爲組件,以便日後更輕鬆地進行分析? – fge

+0

如果可能,我想盡一切辦法使用正則表達式。 – user2551015

+1

那麼,在這種情況下,正則表達式不是最好的工具 – fge

回答

2

刪除 「?」在([a-zA-Z0-9]?)+。 「?」意味着它是可選的,「+」意味着你至少需要一個,這是矛盾的。

編輯:你也必須移動組內的「+」。

這應該工作:

^http\://[\w\-\.]+\.[a-zA-Z]{2}/[\w]{2}/[\w\-]+/(uvw_)+([a-zA-Z0-9]+)([\w\-]*)$ 
+0

現在,它只返回一個值「4」。 – user2551015

+0

我編輯了我的答案,現在它匹配「XY5114」。 – devconsole

+0

謝謝,這工作!另一個我剛剛嘗試過的方法是: ^ http \:// [\ w \ - \。] + \。[a-zA-Z] {2}/[\ w] {2}/[\ w \ - ] + /(uvw _)+([a-zA-Z0-9] *)([\ w \ - ] *)$ – user2551015

0

它是正確的,你只是要提取您的網址的最後一節,並用下劃線來分割呢?在這種情況下,請執行以下操作:

String url = ....; 
int lastSlash = url.lastIndexOf('/'); 
String[] parts = url.substring(lastSlash + 1).split("_"); 
+0

我希望僅使用正則表達式來處理它。但謝謝你的建議。 – user2551015