Перевірте, чи рядок містить лише літери


81

Ідея полягає в тому, щоб прочитати рядок і переконатися, що він не містить жодних цифрових символів. Тож щось на кшталт "smith23" буде неприйнятним.

Відповіді:


139

Що ти хочеш? Швидкість чи простота? Для швидкості скористайтеся циклічним підходом. Для простоти виберіть один підхід на основі RegEx.

Швидкість

public boolean isAlpha(String name) {
    char[] chars = name.toCharArray();

    for (char c : chars) {
        if(!Character.isLetter(c)) {
            return false;
        }
    }

    return true;
}

Простота

public boolean isAlpha(String name) {
    return name.matches("[a-zA-Z]+");
}

15
Тут я можу бути кулон, але "isLetter" - це не те саме, що [a-zA-Z]
krosenvold

4
Майте на увазі, що на Java код a char[]кодується як UTF-16. Це означає, що багатосимвольний гліф (де обидві символи знаходяться в сурогатному діапазоні) не буде розпізнаний як буква при індивідуальному дослідженні Character.isLetter(char). (Див. Docs.oracle.com/javase/7/docs/api/java/lang/… ) Натомість вам потрібно буде використовувати комбінацію String.codePointAt()та Character.isLetter(int). Звичайно, якщо ви точно знаєте , що символи у вашому рядку знаходяться в ASCII або розширеному діапазоні, кодованому одинарним символом, тоді відповідь вище буде працювати.
Ionoclast Brigham

1
Лямбда-підхід був би ще простішим.
Ігор Ганапольський

1
@IgorGanapolsky вимагає API 24 або вище.
Майхан Ніджат,

@MaihanNijat використовувати RetroLambda
ІгорГанапольський

72

Java 8 лямбда-вирази. І швидко, і просто.

boolean allLetters = someString.chars().allMatch(Character::isLetter);

7
Зверніть увагу, що allMatch вимагає API рівня 24
capt.swag


9

Шаблон першого імпорту:

import java.util.regex.Pattern;

Тоді використовуйте цей простий код:

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");    
}

Це виведе:

Ні, виявлено інші символи


6

Я використав цей вираз регулярного виразу (".*[a-zA-Z]+.*"). За допомогою if notтвердження він уникатиме всіх виразів, які мають букву перед, в кінці або між будь-якими типами інших символів.

String strWithLetters = "123AZ456";
if(! Pattern.matches(".*[a-zA-Z]+.*", str1))
 return true;
else return false

.*на початку і в кінці цього не є правильним. Оскільки вони можуть бути будь-якої довжини та включати цифри, 123smith123це буде дійсним ім'ям. Щось на зразок `` ^ [a-zA-Z] + $ `, хоч би працювало, якщо це лише одне слово в рядку.
Andris Leduskrasts

Здається, я дав неправильну відповідь. Ти правий. Мій код перевіряє, чи в рядку немає букви.
iyas

6

Швидкий спосіб зробити це є:

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;
}

Тому що вам не потрібно запускати ціле, aStringщоб перевірити, чи не є це альфа-рядком .


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;
}

Я знаю, що там трохи тісно. Я використовував його зі своєю програмою і відчував бажання поділитися ним з людьми. Він може визначити, будь-який символ у рядку не є літерою чи ні. Використовуйте його, якщо хочете щось легко пояснити та оглянути назад.


4

Швидший спосіб - нижче. Враховуючи літери - це лише аз, 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;
    }

Час роботи обчислюється в наносекундах. Це може відрізнятися від системи до системи.

5748//bettertWay without numbers
true
89493 //isAlpha without  numbers
true
3284 //bettertWay with numbers
false
22989 //isAlpha with numbers
false

4

Перевірте це, я думаю, це допоможе вам, тому що це працює в моєму проекті, тому як тільки ви перевірите цей код

if(! Pattern.matches(".*[a-zA-Z]+.*[a-zA-Z]", str1))
 {
   String not contain only character;
 }
else 
{
  String contain only character;
}

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
        }

4
Це більш складна версія "простоти", яку @adarshr розмістив три роки тому?
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;
}

1
Це перевіряє лише перший символ! Так A12341би повернувся true. -1
jAC

@JanesAbouChleih, так, ти мав рацію. Я його відредагував. Будь ласка, перевірте зараз
Surender Singh

Я видалив свій голос проти. Зараз ця відповідь правильна, але її можна легко вдосконалити, видаливши continueблок. 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

Так, велике спасибі
Surender Singh

-1

Використовуйте метод StringUtils.isAlpha (), і це спростить ваше життя.


1
це копія іншого рішення питання. Будь ласка, подумайте про оновлення, щоб зробити щось інше.
Frayal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.