Chodzi o to, aby odczytać String i sprawdzić, czy nie zawiera on żadnych znaków numerycznych. Więc coś w rodzaju „smith23” byłoby nie do przyjęcia.
81
Co chcesz? Szybkość czy prostota? Jeśli chodzi o szybkość, wybierz podejście oparte na pętli. Dla uproszczenia wybierz podejście oparte na RegEx z jednym liniowcem.
Prędkość
public boolean isAlpha(String name) {
char[] chars = name.toCharArray();
for (char c : chars) {
if(!Character.isLetter(c)) {
return false;
}
}
return true;
}
Prostota
public boolean isAlpha(String name) {
return name.matches("[a-zA-Z]+");
}
char[]
zostanie zakodowany jako UTF-16. Oznacza to, że glif wieloznakowy (w którym oba znaki znajdują się w zakresach zastępczych) nie zostanie rozpoznany jako litera podczas indywidualnego sprawdzania przy użyciuCharacter.isLetter(char)
. (Zobacz docs.oracle.com/javase/7/docs/api/java/lang/… ) Zamiast tego należałoby użyć kombinacjiString.codePointAt()
iCharacter.isLetter(int)
. Oczywiście, jeśli wiesz na pewno, że znaki w twoim ciągu znajdują się w zakresach ASCII lub rozszerzonych kodowanych pojedynczymi znakami, powyższa odpowiedź będzie działać.Wyrażenia lambda Java 8. Szybko i prosto.
boolean allLetters = someString.chars().allMatch(Character::isLetter);
źródło
Lub jeśli używasz Apache Commons, [StringUtils.isAlpha ()] .
źródło
Pierwszy wzór importu:
import java.util.regex.Pattern;
Następnie użyj tego prostego kodu:
String s = "smith23"; if (Pattern.matches("[a-zA-Z]+",s)) { // Do something System.out.println("Yes, string contains letters only"); }else{ System.out.println("Nope, Other characters detected"); }
Spowoduje to wyświetlenie:
źródło
Użyłem tego wyrażenia regularnego
(".*[a-zA-Z]+.*")
. Zif not
instrukcją uniknie wszystkich wyrażeń, które mają literę przed, na końcu lub między jakimkolwiek innym znakiem.String strWithLetters = "123AZ456"; if(! Pattern.matches(".*[a-zA-Z]+.*", str1)) return true; else return false
źródło
.*
na początku i na końcu to nie jest poprawna. Ponieważ mogą mieć dowolną długość i zawierać cyfry,123smith123
będzie to poprawna nazwa. Coś w rodzaju `` ^ [a-zA-Z] + $ `działałoby jednak, gdyby było to tylko pojedyncze słowo w ciągu.Szybki sposób to zrobić jest przez:
public boolean isStringAlpha(String aString) { int charCount = 0; String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; if (aString.length() == 0) { return false; //zero length string ain't alpha } for (int i = 0; i < aString.length(); i++) { for (int j = 0; j < alphabet.length(); j++) { if (aString.substring(i, i + 1).equals(alphabet.substring(j, j + 1)) || aString.substring(i, i + 1).equals(alphabet.substring(j, j + 1).toLowerCase())) { charCount++; } } if (charCount != (i + 1)) { System.out.println("\n**Invalid input! Enter alpha values**\n"); return false; } } return true; }
Ponieważ nie musisz uruchamiać całości,
aString
aby sprawdzić, czy nie jest to ciąg alfa .źródło
private boolean isOnlyLetters(String s){ char c=' '; boolean isGood=false, safe=isGood; int failCount=0; for(int i=0;i<s.length();i++){ c = s.charAt(i); if(Character.isLetter(c)) isGood=true; else{ isGood=false; failCount+=1; } } if(failCount==0 && s.length()>0) safe=true; else safe=false; return safe; }
Wiem, że jest trochę tłoczno. Używałem go z moim programem i czułem chęć podzielenia się nim z ludźmi. Potrafi stwierdzić, czy jakikolwiek znak w ciągu nie jest literą, czy nie. Użyj go, jeśli chcesz czegoś łatwego do wyjaśnienia i spojrzenia wstecz.
źródło
Szybszy sposób jest poniżej. Rozpatrywane litery to tylko az, AZ.
public static void main( String[] args ){ System.out.println(bestWay("azAZpratiyushkumarsinghjdnfkjsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); System.out.println(isAlpha("azAZpratiyushkumarsinghjdnfkjsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); System.out.println(bestWay("azAZpratiyushkumarsinghjdnfkjsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); System.out.println(isAlpha("azAZpratiyushkumarsinghjdnfkjsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); } public static boolean bettertWay(String name) { char[] chars = name.toCharArray(); long startTimeOne = System.nanoTime(); for(char c : chars){ if(!(c>=65 && c<=90)&&!(c>=97 && c<=122) ){ System.out.println(System.nanoTime() - startTimeOne); return false; } } System.out.println(System.nanoTime() - startTimeOne); return true; } public static boolean isAlpha(String name) { char[] chars = name.toCharArray(); long startTimeOne = System.nanoTime(); for (char c : chars) { if(!Character.isLetter(c)) { System.out.println(System.nanoTime() - startTimeOne); return false; } } System.out.println(System.nanoTime() - startTimeOne); return true; }
Czas działania jest obliczany w nano sekundach. Może się różnić w zależności od systemu.
5748//bettertWay without numbers true 89493 //isAlpha without numbers true 3284 //bettertWay with numbers false 22989 //isAlpha with numbers false
źródło
Sprawdź to, myślę, że to ci pomaga, ponieważ działa w moim projekcie, więc po sprawdzeniu tego kodu
if(! Pattern.matches(".*[a-zA-Z]+.*[a-zA-Z]", str1)) { String not contain only character; } else { String contain only character; }
źródło
String expression = "^[a-zA-Z]*$"; CharSequence inputStr = str; Pattern pattern = Pattern.compile(expression); Matcher matcher = pattern.matcher(inputStr); if(matcher.matches()) { //if pattern matches } else { //if pattern does not matches }
źródło
Spróbuj użyć wyrażeń regularnych: String.matches
źródło
public boolean isAlpha(String name) { String s=name.toLowerCase(); for(int i=0; i<s.length();i++) { if((s.charAt(i)>='a' && s.charAt(i)<='z')) { continue; } else { return false; } } return true; }
źródło
A12341
wrócętrue
. -1continue
blok.public boolean isAlpha(String name) { String s = name.toLowerCase(); for (int i = 0; i < s.length(); i++) { if ((s.charAt(i) < 'a' || s.charAt(i) > 'z')) { return false; } } return true; }
Użyj metody StringUtils.isAlpha (), a ułatwi Ci to życie.
źródło