Spec-Zone .ru
спецификации, руководства, описания, API
След: Существенные Классы
Урок: Регулярные выражения
Методы Класса Matcher
Домашняя страница > Существенные Классы > Регулярные выражения

Методы Класса Matcher

Этот раздел описывает некоторые дополнительные полезные методы Matcher class. Для удобства упомянутые ниже методы группируются согласно функциональности.

Индексируйте Методы

Индексируйте методы, обеспечивают полезный, индексируют значения, которые показывают точно, где соответствие было найдено в строке ввода:

Методы исследования

Методы исследования рассматривают строку ввода и возвращают булево указание, находится ли образец.

Заменяющие Методы

Заменяющие методы являются полезными методами для того, чтобы заменить текст в строке ввода.

Используя start и end Методы

Вот пример, MatcherDemo.java, это считает число раз, слово "собака" появляется в строке ввода.


import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class MatcherDemo {

    private static final String REGEX =
        "\\bdog\\b";
    private static final String INPUT =
        "dog dog dog doggie dogg";

    public static void main(String[] args) {
       Pattern p = Pattern.compile(REGEX);
       //  get a matcher object
       Matcher m = p.matcher(INPUT);
       int count = 0;
       while(m.find()) {
           count++;
           System.out.println("Match number "
                              + count);
           System.out.println("start(): "
                              + m.start());
           System.out.println("end(): "
                              + m.end());
      }
   }
}

OUTPUT:

Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11

Можно видеть, что этот пример использует границы слова, чтобы гарантировать что буквы "d" "o" "g" не просто подстрока в более длительном слове. Это также дает немного полезной информации о том, где в строке ввода соответствие произошло. start метод возвращается, запуск индексируют подпоследовательности, полученной данной группой во время предыдущей работы соответствия, и end возвращает индексирование соответствующего последнего знака, плюс один.

Используя matches и lookingAt Методы

matches и lookingAt методы обе попытки соответствовать входную последовательность против образца. Различие, однако, является этим matches требует, чтобы вся входная последовательность была соответствующей, в то время как lookingAt не делает. Оба метода всегда запускаются в начале строки ввода. Вот полный код, MatchesLooking.java:


import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class MatchesLooking {

    private static final String REGEX = "foo";
    private static final String INPUT =
        "fooooooooooooooooo";
    private static Pattern pattern;
    private static Matcher matcher;

    public static void main(String[] args) {
   
        // Initialize
        pattern = Pattern.compile(REGEX);
        matcher = pattern.matcher(INPUT);

        System.out.println("Current REGEX is: "
                           + REGEX);
        System.out.println("Current INPUT is: "
                           + INPUT);

        System.out.println("lookingAt(): "
            + matcher.lookingAt());
        System.out.println("matches(): "
            + matcher.matches());
    }
}

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false

Используя replaceFirst(String) и replaceAll(String)

replaceFirst и replaceAll методы заменяют текст, который соответствует данное регулярное выражение. Поскольку их имена указывают, replaceFirst заменяет первое возникновение, и replaceAll замены все происшествия. Вот ReplaceDemo.java код:


import java.util.regex.Pattern; 
import java.util.regex.Matcher;

public class ReplaceDemo {
 
    private static String REGEX = "dog";
    private static String INPUT =
        "The dog says meow. All dogs say meow.";
    private static String REPLACE = "cat";
 
    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        // get a matcher object
        Matcher m = p.matcher(INPUT);
        INPUT = m.replaceAll(REPLACE);
        System.out.println(INPUT);
    }
}

OUTPUT: The cat says meow. All cats say meow.

В этой первой версии, всех возникновениях dog заменяются cat. Но почему остановка здесь? Вместо того, чтобы заменять простой литерал как dog, можно заменить текст, который соответствует любое регулярное выражение. API для этого метода утверждает что "данный регулярное выражение a*b, ввод aabfooaabfooabfoob, и заменяющая строка -, вызов этого метода на matcher для того выражения привел бы к строке -foo-foo-foo-."

Вот ReplaceDemo2.java код:


import java.util.regex.Pattern;
import java.util.regex.Matcher;
 
public class ReplaceDemo2 {
 
    private static String REGEX = "a*b";
    private static String INPUT =
        "aabfooaabfooabfoob";
    private static String REPLACE = "-";
 
    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        // get a matcher object
        Matcher m = p.matcher(INPUT);
        INPUT = m.replaceAll(REPLACE);
        System.out.println(INPUT);
    }
}

OUTPUT: -foo-foo-foo-

Чтобы заменить только первое возникновение образца, просто вызовите replaceFirst вместо replaceAll. Это принимает тот же самый параметр.

Используя appendReplacement(StringBuffer,String) и appendTail(StringBuffer)

Matcher class также обеспечивает appendReplacement и appendTail методы для текстовой замены. Следующий пример, RegexDemo.java, использование эти два метода, чтобы достигнуть того же самого эффекта как replaceAll.


import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexDemo {
 
    private static String REGEX = "a*b";
    private static String INPUT = "aabfooaabfooabfoob";
    private static String REPLACE = "-";
 
    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        Matcher m = p.matcher(INPUT); // get a matcher object
        StringBuffer sb = new StringBuffer();
        while(m.find()){
            m.appendReplacement(sb,REPLACE);
        }
        m.appendTail(sb);
        System.out.println(sb.toString());
    }
}


OUTPUT: -foo-foo-foo- 

Эквиваленты Метода Matcher в java.lang.String

Для удобства, String class подражает нескольким Matcher методы также:


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Методы Класса Образца
Следующая страница: Методы Класса PatternSyntaxException