Сравнение производительности различных регулярных выражений, требуется уточнение - PullRequest
4 голосов
/ 06 февраля 2012

Рассмотрим 3 выражения регулярного выражения, предназначенные для удаления нелатинских символов из строки.

    String x = "some†¥¥¶¶ˆ˚˚word";

    long now = System.nanoTime();
    System.out.println(x.replaceAll("[^a-zA-Z]", ""));     // 5ms
    System.out.println(System.nanoTime() - now);

    now = System.nanoTime();
    System.out.println(x.replaceAll("[^a-zA-Z]+", ""));    // 2ms
    System.out.println(System.nanoTime() - now);

    now = System.nanoTime();
    System.out.println(x.replaceAll("[^a-zA-Z]*", ""));    // <1ms
    System.out.println(System.nanoTime() - now);

Все 3 дают один и тот же результат с очень разными показателями производительности.

Почему это?

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Последний заменит пустые строки на пустые строки (если это не оптимизировано, я не знаю компилятор), что кажется немного ненужным ...; -)

Первый будет искать намного больше, чем второй, если нелатинские символы являются приличными. В противном случае нет. Поэтому я предполагаю, что время для 1 и 2 может быть примерно одинаковым для некоторых текстов и больше для 1 для других текстов.

1 голос
/ 06 февраля 2012

Первый медленнее, потому что регулярное выражение соответствует каждому нелатинскому символу индивидуально, поэтому replaceAll работает с каждым символом индивидуально.

Другие шаблоны соответствуют всей последовательности нелатинских символов, поэтому replaceAll может заменить всю последовательность за один раз. Я не могу объяснить разницу в производительности между этими двумя, хотя. Возможно, это связано с разницей в обработке * и + в движке регулярных выражений.

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