2011-09-22 108 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+)?) 

[^\/]将捕获任何东西,但/

相关问题