почему это Java регулярное выражение не работает, как я хочу? - PullRequest
0 голосов
/ 22 сентября 2011

Это два типа строк, которые я могу получить на входе:

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 голосов
/ 22 сентября 2011

Попробуйте это

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

[^\/] будет захватывать все, кроме /

0 голосов
/ 22 сентября 2011

В вашем регулярном выражении есть две проблемы:

  1. Для (.+ ) требуется пробел в конце группы.
  2. .+ - жадное совпадение, поэтому оно соответствует оставшейся части строки.

Попробуйте следующее регулярное выражение:

/ABCD/(.+?)(/\\w+/\\d+)?$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...