Понимание Pattern и Matcher - PullRequest
       15

Понимание Pattern и Matcher

0 голосов
/ 15 декабря 2009

Рассмотрим этот код:

import java.util.regex.*;

public class Pattern3 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        Pattern p = Pattern.compile("Our"); //line 1
        Matcher m = p.matcher("Our mom and Our dad"); //line 2

        //p.compile(mom); commented line

         StringBuffer s = new StringBuffer();



       boolean found = m.find();

        while (found){
            m.appendReplacement(s, "My"); //line 3
            found=m.find();
        }

       m.appendTail(s); //line 4
       System.out.println(s);
    }

}

a) Почему мне нужно вызвать m.appendTrail(s) в строке 4, чтобы получить неотрезанную строку?

b) Почему выход не изменяется, когда я раскомментирую и помещаю "mom" в качестве нового выражения регулярного выражения?

Ответы [ 3 ]

3 голосов
/ 15 декабря 2009

Просто прочитайте документацию по

Matcher.appendReplacement и

Matcher.appendTail

Там все объясняется, каково намерение использовать эти два метода вместе.


Изменение шаблона после создания экземпляра сопоставителя, конечно, не повлияет на уже созданный сопоставитель. Вы должны изменить шаблон, прежде чем создавать сопоставитель.

1 голос
/ 15 декабря 2009

Ответ на б)

Pattern.compile() - статический метод. Если вы раскомментируете p.compile();, он создаст новый объект, который вы отбрасываете (он ни к чему не привязан). Чтобы получить то, что вы хотели, вам нужно сделать что-то вроде:

p = Pattern.compile("mom");

, а затем получите новый сопоставитель из вновь созданного шаблона.

0 голосов
/ 16 декабря 2009

Ответ а)

.appendReplacement () выполняет итерацию вдоль строки соответствия («Наша мама и наш папа») и, если шаблон («наш») найден, заменяет строку замены («Моя») на шаблон («Наш ") и помещает все, что повторялось, в StringBuffer (s). Если больше шаблонов не найдено, это ничего не делает. То есть он не будет добавлять ничего после последнего шаблона. Поэтому .appendTail () вызывается для получения остатка строки соответствия.

m.replaceAll ( "Мои"); можно использовать для достижения того же результата.

...