Мой код выглядит следующим образом:Matcher.find() в Java есть результат ошибки когда группа регулярное выражение
@Test
public void testMatcher2(){
String pa2 = "^\\s*(\\w+)\\.(\\w+)\\s*(EQUALS|NOT_EQUALS)\\s*(.*$)";
Pattern p = Pattern.compile(pa2, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("Class.fieldNOT_EQUALS'someval'");
boolean bb = m.find();
System.out.println(bb); //#1
System.out.printf("A=%s. B=%s. C=%s\n", m.group(1),m.group(2),m.group(3));
while (m.find()){ //#2
System.out.println("a");
String a = m.group(1);
String b = m.group(2);
String c = m.group(3);
System.out.printf("a=%s. b=%s. c=%s\n", a,b,c);
}
}
и результат, как показано ниже:
верно
A = Класс. В = fieldNOT_. C = РАВНО
Мои вопросы:
m.find() возвращает истину, когда называют независимо друг от друга (# 1), почему он возвращает ложь при вызове в то время как() (# 2) ?
В этом регулярном выражении,
Class.fieldNOT_EQUALS'someval'
могут быть сгруппированы в 2-х результатах (я думаю):Class/field/NOT_EQUALS/'someval'
(R1, это то, что я хочу) иClass/fieldNOT_/EQUALS/'someval'
(R2, результат программы), то почемуMatcher
Разделить ехр в до R2? Если я хочу получить R1 без изменения exp, как мне его получить?
Любые ответы приветствуются.
Попробуйте переписать свой второй вопрос, так как трудно понять, что вы просите. Что касается первого вопроса, если вы удалите свой первый 'find()', вы увидите, что 'find()' внутри вашего while возвращает true. Из javadocs: «Попытка найти следующую подпоследовательность входной последовательности, которая соответствует шаблону» - [javadoc] (http://docs.oracle.com/javase/6/docs/api/java/util/regex/Matcher .html). Однако ваше регулярное выражение никогда не даст «true» дважды из-за ваших якорей начала/конца, что приводит к полному совпадению. – atomman
atomman имеет ответ на часть 1. В части 2 попробуйте использовать ленивый квантификатор вместо жадного - '(\\ w +) \\. (\\ w +?)' Тот факт, что вы используете жадный квантификатор, означает, что он будет постарайтесь сделать все возможное. –