2013-11-25 1 views
0

Мой код выглядит следующим образом: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 = РАВНО

Мои вопросы:

  1. m.find() возвращает истину, когда называют независимо друг от друга (# 1), почему он возвращает ложь при вызове в то время как() (# 2) ?

  2. В этом регулярном выражении, Class.fieldNOT_EQUALS'someval' могут быть сгруппированы в 2-х результатах (я думаю): Class/field/NOT_EQUALS/'someval' (R1, это то, что я хочу) и Class/fieldNOT_/EQUALS/'someval' (R2, результат программы), то почему Matcher Разделить ехр в до R2? Если я хочу получить R1 без изменения exp, как мне его получить?

Любые ответы приветствуются.

+2

Попробуйте переписать свой второй вопрос, так как трудно понять, что вы просите. Что касается первого вопроса, если вы удалите свой первый 'find()', вы увидите, что 'find()' внутри вашего while возвращает true. Из javadocs: «Попытка найти следующую подпоследовательность входной последовательности, которая соответствует шаблону» - [javadoc] (http://docs.oracle.com/javase/6/docs/api/java/util/regex/Matcher .html). Однако ваше регулярное выражение никогда не даст «true» дважды из-за ваших якорей начала/конца, что приводит к полному совпадению. – atomman

+0

atomman имеет ответ на часть 1. В части 2 попробуйте использовать ленивый квантификатор вместо жадного - '(\\ w +) \\. (\\ w +?)' Тот факт, что вы используете жадный квантификатор, означает, что он будет постарайтесь сделать все возможное. –

ответ

1

m.find() возвращает true, когда его вызывают независимо (# 1), почему он возвращает false, вызываемый while while() (# 2).

См Matcher «s Javadoc: http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html

Этот метод [найти] начинается в начале области этого Сличитель, либо, если предыдущий вызов метода был успешным и сличитель не имеет, так как был сброшен, причем первый символ не соответствовал предыдущему совпадению.

Что касается второго вопроса, то причина, почему ваш Matcher является разделяющей так жаден Matching: Matcher пытается получить как можно больше символов, как это возможно, когда соответствие каждой части регулярного выражения. NOT_ потребляется не частью (EQUALS|NOT_EQUALS) выражения, а более ранними подстановочными знаками. Используйте неохотные квантификаторы (см. Javadoc на Pattern) вместо жадных, чтобы исправить это.

+0

Этот ответ был бы лучше, если бы вы предоставили решение вопроса 2. Как вы делаете нежеланное соответствие? –

+0

Я был просто занят добавлением его, ответ в JavaDoc. – kviiri

+0

спасибо kviiri. Я должен внимательно прочитать документ. опубликовать отличия этого 2 квантификаторов: Жадные кванторы X + один или несколько раз Вынужденные квантификаторы Х +? один или несколько раз – user2582436

 Смежные вопросы

  • Нет связанных вопросов^_^