Это может сработать, но я не знаю, так ли это вам нужно.
Когда вы используете matches
, произойдет сбой, если вся последовательность не совпадает, но вы все равно можете использовать find
, чтобы увидеть, содержит ли остальная часть последовательности шаблон, и, таким образом, понять, почему он потерпел неудачу:
import java.util.regex.*;
import static java.lang.System.out;
class F {
public static void main( String ... args ) {
String input = args[0];
String re = "N{1,3}Y";
Pattern p = Pattern.compile(re);
Matcher m = p.matcher(input);
out.printf("Evaluating: %s on %s%nMatched: %s%n", re, input, m.matches() );
for( int i = 0 ; i < input.length() ; i++ ) {
out.println();
boolean found = m.find(i);
if( !found ) {
continue;
}
int s = m.start();
int e = m.end();
i = s;
out.printf("m.start[%s]%n"
+"m.end[%s]%n"
+"%s[%s]%s%n",s,e,
input.substring(0,s),
input.substring(s,e),
input.substring(e) );
}
}
}
Вывод:
C:\Users\oreyes\java\re>java F NNNNY
Evaluating: N{1,3}Y on NNNNY
Matched: false
m.start[1]
m.end[5]
N[NNNY]
m.start[2]
m.end[5]
NN[NNY]
m.start[3]
m.end[5]
NNN[NY]
C:\Users\oreyes\java\re>java F XNNY
Evaluating: N{1,3}Y on XNNY
Matched: false
m.start[1]
m.end[4]
X[NNY]
m.start[2]
m.end[4]
XN[NY]
В первом выводе: N[NNNY]
вы можете указать, где слишком много N, во втором: X[NNY]
присутствовал X.
Вот другой вывод
C:\Users\oreyes\java\re>java F NYXNNXNNNNYX
Evaluating: N{1,3}Y on NYXNNXNNNNYX
Matched: false
m.start[0]
m.end[2]
[NY]XNNXNNNNYX
m.start[7]
m.end[11]
NYXNNXN[NNNY]X
m.start[8]
m.end[11]
NYXNNXNN[NNY]X
m.start[9]
m.end[11]
NYXNNXNNN[NY]X
Шаблон есть, но все выражение не совпадает.
Немного сложно понять, как найти, сопоставить и посмотреть, как это работает из документа (по крайней мере, это случилось со мной), но я надеюсь, что этот пример поможет вам разобраться.
совпадения похожи на /^YOURPATTERNHERE$/
lookAt похожи на /^YOURPATTERNHERE/
находка похожа на /YOURPATTERNHERE/
Надеюсь, это поможет.