В основном: если есть операция без регулярных выражений, которая делает то, что вы хотите за один шаг, всегда идите на это.
Это не столько вопрос производительности, сколько) удобочитаемость и б) безопасность во время компиляции.Специализированные версии без регулярных выражений обычно намного легче читать, чем регулярные выражения.И опечатка в одном из этих специализированных методов не будет компилироваться, в то время как опечатка в Regex с треском провалится во время выполнения.
Сравнение решений на основе Regex с решениями не-Regex
String s = "Magic_Carpet_Ride";
s.startsWith("Magic"); // non-regex
s.matches("Magic.*"); // regex
s.contains("Carpet"); // non-regex
s.matches(".*Carpet.*"); // regex
s.endsWith("Ride"); // non-regex
s.matches(".*Ride"); // regex
Во всех этих случаях это просто: используйте версию без регулярных выражений.
Но когда все становится немного сложнее, это зависит.Я думаю, что я все еще буду придерживаться не-регулярных выражений в следующем случае, но многие не будут:
// Test whether a string ends with "magic" in any case,
// followed by optional white space
s.toLowerCase().trim().endsWith("magic"); // non-regex, 3 calls
s.matches(".*(?i:magic)\\s*"); // regex, 1 call, but ugly
И в ответ на RegexesCanCertainlyBeEasierToReadThanMultipleFunctionCallsToDoTheSameThing
:
Я все ещеЯ думаю, что версия без регулярных выражений более читабельна, но я бы написал так:
s.toLowerCase()
.trim()
.endsWith("magic");
Разница не так?