Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个java正则表达式没有按我所希望的那样工作?_Java_Regex - Fatal编程技术网

为什么这个java正则表达式没有按我所希望的那样工作?

为什么这个java正则表达式没有按我所希望的那样工作?,java,regex,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"; 这有两种可能的情况,有*

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

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";
这有两种可能的情况,有*/一些单词/一些数字*和没有它

我写了这个正则表达式,它给出了一个我不理解的结果:

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中,我要检索的字符串被截断。 另外,为什么在包含边界后会导致match find=false

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

谢谢你的正则表达式有两个问题:

.+需要在组的末尾留一个空格。 .+是贪婪匹配,因此它匹配字符串的其余部分。 请尝试以下正则表达式:

/ABCD/(.+?)(/\\w+/\\d+)?$
试试这个

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

[^\/]将捕获任何内容,但它不会被截断。尝试添加耦合或println语句System.out.printlnm.group3;System.out.printlnm.group4;您将看到。您的第二个捕获组在末尾需要一个空格,因此它在输入中的最后一个空格后停止捕获。我始终获得组计数=3,但对于mex1,组3为空,第四组总是提出越界的例外。你到底想得到什么?我想要第二组。开始时排除/ABCD/和出现后的任何/word/number如果我主要是想理解为什么它不起作用,那么不幸的是,它可能包含斜杠:-@Leonardo:我重写了我的答案。它实际上起作用了,你能解释一下为什么我需要一个空格吗?@Leonardo:在正则表达式中,任何非特殊字符都是完全匹配的。而空格并不是一个特殊的字符。和+是。因此,+点加空格表示后跟空格的任何字符,我们可以忽略括号,因为它们不会影响匹配。
(/ABCD/)([^\/]+(/\\w+/\\d+)?)