为什么这个java正则表达式不能正常工作?

时间:2011-09-22 14:57:43

标签: java regex

这是我可以在输入中获得的两种类型的字符串:

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+)?$");

感谢

2 个答案:

答案 0 :(得分:0)

你的正则表达式存在两个问题:

  1. (.+ ) 需要该组末尾的空格。
  2. .+是一个贪婪的匹配,所以它匹配字符串的其余部分。
  3. 尝试以下正则表达式:

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

答案 1 :(得分:0)

试试这个

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

[^\/]除了/

之外还会捕获任何内容