2011-09-22 78 views
0

這是兩個字符串類型的,我可以在輸入得到:爲什麼這個java的正則表達式不工作,因爲我想?

String mex1 = "/ABCD/YY YYYYY SPA QWE XXXXX XXXXX SPA - 02342990153*XXXXX XXXX SPA ABCD LEGALI"; 
String mex2 = "/ABCD/YY YYYYY SPA QWE XXXXX XXXXX SPA - 02342990153*XXXXX XXXX SPA ABCD LEGALI/ORDERS/9865432342990160"; 

落入兩種可能的情況下,以*/some_word/some_number *沒有它

我寫了這個正則表達式這是給因此我不明白:

String mex=//<one of two input cases as already explained> 
Pattern p = Pattern.compile("(/ABCD/)(.+)(/\\w+/\\d+)?"); 
Matcher m = p.matcher(mex); 
if(m.find()) {  
    System.out.println(m.group(1)); 
    System.out.println(m.group(2)); // this the group I would like to retrieve... 
} 

,其結果是:

mex2 

/ABCD/ 
YY YYYYY SPA QWE XXXXX XXXXX SPA - 02342990153*XXXXX XXXX SPA ABCD LEGALI 

mex1 
/ABCD/ 
YY YYYYY SPA QWE XXXXX XXXXX SPA - 02342990153*XXXXX XXXX SPA ABCD 

這不是我所期望的特別與mex2,其中我想要檢索的字符串被截斷。 此外,爲什麼在包含邊界結果後匹配find = false?

Pattern p = Pattern.compile("^(/ABCD/)(.+)(/\\w+/\\d+)?$"); 

感謝

+0

它不會被截斷。嘗試添加夫婦或println語句System.out.println(m.group(3));的System.out.println(m.group(4));你會看到。 –

+3

您的第二個捕獲組在最後需要一個空格,因此它會在輸入的最後一個空格後停止捕獲。 – Howard

+0

我總是得到組計數= 3,但是用mex1組3是空的,組4總是提高出界限的異常。 – Leonardo

回答

0

有兩個問題與您正則表達式:

  1. (.+)需要在一組的最後空間。
  2. .+是一個貪婪的匹配,所以它匹配字符串的其餘部分。

試試下面的正則表達式:

/ABCD/(.+?)(/\\w+/\\d+)?$ 
+0

主要是我試圖理解爲什麼它不工作,然後不幸的是,它可能包含斜槓:-) – Leonardo

+0

@Leonardo:我已經重寫了我的答案。 – NPE

+0

實際上,你能解釋爲什麼我需要一個空間(。+ )嗎? – Leonardo

0

試試這個

(/ABCD/)([^\/]+(/\\w+/\\d+)?) 

[^\/]將捕獲任何東西,但/

相關問題