Regex в Java и его производительность по сравнению с indexOf - PullRequest
6 голосов
/ 16 ноября 2011

Пожалуйста, может кто-нибудь сказать мне, как сопоставить "_" и точку "."один раз в строке с использованием регулярных выражений. Также более эффективно использование indexOf () вместо выражения регулярных выражений.

String s= "Hello_Wor.ld"  or 
s="12323_!£££$.asdfasd"

В принципе, любое количество символов может быть до и после _ и .. Единственное требование состоит в том, что вся строка должна содержать только одно вхождение _ и .

Ответы [ 2 ]

7 голосов
/ 16 ноября 2011

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

Просто проверьте, если indexOf('_') >= 0, а затем, если indexOf('_', indexOfFirstUnderScore) < 0.Сделайте то же самое для периода.

private boolean containsOneAndOnlyOne(String s, char c) {
    int firstIndex = s.indexOf(c);
    if (firstIndex < 0) {
        return false;
    }
    int secondIndex = s.indexOf(c, firstIndex + 1);
    return secondIndex < 0;
}
2 голосов
/ 16 ноября 2011

Соответствует строке с одним .:

/^[^.]*\.[^.]*$/

То же самое для _:

/^[^_]*_[^_]*/

Объединенное регулярное выражение должно выглядеть примерно так:

/^([^._]*\.[^._]*_[^._]*)|([^._]*_[^._]*\.[^._]*)$/

Теперь должно быть очевидно, что indexOf - лучшее решение, более простое (производительность не имеет значения, пока не будет показано, что это узкое место).

Если интересно, обратите внимание, что объединенное регулярное выражение имеет два термина: «строка с одним . перед одним _» и наоборот. Было бы шесть для трех символов, и п! для п. Было бы проще запустить оба регулярных выражения и результат И, чем использовать объединенное регулярное выражение.

При использовании регулярных выражений всегда нужно искать более простое решение.

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