Nie jest uniwersalne. Rozwiązanie z regexem mieści się w linijce kodu. Metoda z substringiem nie dość, że wymaga iterowania po całym ciągu, to jeszcze tworzy tyle nowych Stringów, ile masz znaków. Można by zrobić to normalnie, po znaku, ale ten sposób wciąż nie będzie poprawny dla wszystkich przypadków:
public static boolean containsOnlyLetters1(String string) {
return string.matches("\\pL*");
}
public static boolean containsOnlyLetters2(String string) {
for (int i = 0; i < string.length(); i++) {
if (!Character.isLetter(string.charAt(i))) {
return false;
}
}
return true;
}
public static void main(String[] args) {
String string = "\uD800\uDC00"; // LINEAR B SYLLABLE B008 A (U+10000)
System.out.println(containsOnlyLetters1(string)); // true
System.out.println(containsOnlyLetters2(string)); // false
}
Tak więc nie jest ani uniwersalne, ani nie obsługuje wszystkich znaków. Dopiero takie rozwiązanie będzie poprawne:
public static boolean containsOnlyLetters3(String string) {
int i = 0;
while (i < string.length()) {
int codePoint = Character.codePointAt(string, i);
if (!Character.isLetter(codePoint)) {
return false;
}
i += Character.charCount(codePoint);
}
return true;
}