Sprawdź, czy ciąg zawiera tylko litery

81

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.

Kodie hill
źródło

Odpowiedzi:

139

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]+");
}
adarshr
źródło
15
Mogę tu być pendantyczny, ale „isLetter” to nie to samo, co [a-zA-Z]
krosenvold
4
Należy pamiętać, że w Javie a 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życiu Character.isLetter(char). (Zobacz docs.oracle.com/javase/7/docs/api/java/lang/… ) Zamiast tego należałoby użyć kombinacji String.codePointAt()i Character.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ć.
Ionoclast Brigham
1
Podejście lambda byłoby jeszcze prostsze.
IgorGanapolsky
1
@IgorGanapolsky wymaga API 24 lub nowszego.
Maihan Nijat
@MaihanNijat używa RetroLambda
IgorGanapolsky
72

Wyrażenia lambda Java 8. Szybko i prosto.

boolean allLetters = someString.chars().allMatch(Character::isLetter);
Max Malysh
źródło
7
Zauważ, że allMatch wymaga API na poziomie 24
capt.swag
9

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:

Nie, wykryto inne znaki

shalamus
źródło
6

Użyłem tego wyrażenia regularnego (".*[a-zA-Z]+.*"). Z if notinstrukcją 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
iyas
źródło
.*na początku i na końcu to nie jest poprawna. Ponieważ mogą mieć dowolną długość i zawierać cyfry, 123smith123bę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.
Andris Leduskrasts
Chyba podałem złą odpowiedź. Masz rację. Mój kod sprawdza, czy ciąg nie zawiera żadnej litery.
iyas,
6

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, aStringaby sprawdzić, czy nie jest to ciąg alfa .

mark_infinite
źródło
4
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.

LifesAway
źródło
4

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
Pratiyush Kumar Singh
źródło
4

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;
}
Pravin Suthar
źródło
3
        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
        }
user3717716
źródło
4
Czy to bardziej skomplikowana wersja „Prostoty”, którą @adarshr opublikował trzy lata temu?
mabi
1
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;
}
Surender Singh
źródło
1
To sprawdza tylko pierwszy znak! Więc A12341wrócę true. -1
JAC
@JanesAbouChleih, tak, miałeś rację. Edytowałem to. Sprawdź teraz
Surender Singh,
Usunąłem swój głos przeciw. Ta odpowiedź jest teraz poprawna, ale można ją łatwo poprawić, usuwając continueblok. 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; }
JAC
Tak, wielkie dzięki
Surender Singh
-1

Użyj metody StringUtils.isAlpha (), a ułatwi Ci to życie.

Shyadav
źródło
1
to jest kopia innego rozwiązania pytania. Rozważ aktualizację, aby zrobić coś innego.
Frayal