В чем разница между String.matches и Matcher.matches? - PullRequest
40 голосов
/ 18 марта 2010

В чем разница между String.matches и Matcher.matches?Есть ли разница в производительности или других вещах?

Ответы [ 5 ]

53 голосов
/ 18 марта 2010

Абсолютно. Matcher создается в предварительно скомпилированном регулярном выражении, в то время как String.matches должен перекомпилировать регулярное выражение каждый раз, когда он выполняется, поэтому он становится более расточительным, чем чаще вы запускаете эту строку кода.

29 голосов
/ 18 марта 2010

String.matches внутренне делегирует Matcher.matches.

public boolean matches(String regex) {
    return Pattern.matches(regex, this);
}

public static boolean matches(String regex, CharSequence input) {
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(input);
    return m.matches();
}

Если вы повторно используете объект Pattern, тогда будет некоторое повышение производительности. Также при использовании Pattern / Matcher вы можете группировать свои регулярные выражения и получать соответствующие части.

Суть в том, что если у вас есть регулярное выражение, которое вы будете использовать только один раз, и вам не нужно анализировать вашу строку, чтобы получить совпадающие части, используйте другое Но если вы собираетесь использовать одно и то же регулярное выражение для нескольких строк или вам нужны части строки, основанные на регулярном выражении, создайте шаблон и используйте Matcher, используя его.

11 голосов
/ 22 января 2017

Из любопытства я сделал этот небольшой тест на разницу во времени. Оказывается, что с использованием предварительно скомпилированного шаблона более чем в 5 раз быстрее , чем при использовании метода String.matches.

import java.util.regex.Pattern;

/**
 * @author Rajind Ruparathna
 */
public class MatchesTest {
    public static void main(String Args[]) {
        String first = "@\\{message.headers\\.?([^\\}]*)\\}";
        String second = "@\\{message.headers.wolla\\}";
        long start, end, total;
        float avg;
        int NUM_OF_ITERATIONS = 100;

        Pattern pattern = Pattern.compile(first);

        total = 0;
        start = 0;
        end = 0;
        avg = 0;

        for (int i=0; i< NUM_OF_ITERATIONS; i++) {
            start = System.nanoTime();
            pattern.matcher(second).matches();
            end = System.nanoTime();
            total = total + (end - start);
        }
        avg = total/NUM_OF_ITERATIONS;
        System.out.println("Duration pre compiled: " + avg);

        total = 0;
        start = 0;
        end = 0;
        avg = 0;

        for (int i=0; i< NUM_OF_ITERATIONS; i++) {
            start = System.nanoTime();
            first.matches(second);
            end = System.nanoTime();
            total = total + (end - start);
        }
        avg = total/NUM_OF_ITERATIONS;
        System.out.println("In place compiled: " + avg);
    }
}

Выход (наносекунды):

Duration pre compiled: 4505.0

In place compiled:    44960.0

P.S. Этот тест является быстрым и грязным тестом и может не соответствовать практике тестирования производительности. Если вы хотите получить очень точные результаты, пожалуйста, используйте инструмент микро-бенчмаркинга.

5 голосов
/ 18 марта 2010

String.matches внутренние звонки Pattern.matches(regex, str). Проблема в том, что каждый раз, когда вы вызываете его, вы перекомпилируете шаблон, который стоит некоторых ресурсов.

Лучше один раз скомпилировать ваш шаблон, затем попытаться сопоставить его со всеми желаемыми строками. Я лично использую класс Patterns, содержащий все мои шаблоны в моем приложении, объявленные как final и static

0 голосов
/ 13 мая 2017

Pattern.compile компилирует шаблон так, чтобы при выполнении metcher.matches шаблон не компилировался снова и снова Pattern.compile предварительно компилирует его. Однако, если вы используете string.matches, он компилирует шаблон каждый раз, когда вы выполняете эту строку. Итак, лучше использовать Pattern.compile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...