Який найкращий спосіб визначити, чи символом є літера чи цифра на Java, не використовуючи регулярні вирази?


125

Який найкращий та / або найпростіший спосіб розпізнати, якщо string.charAt (індекс) - це буква Az або число в Java без використання регулярних виразів? Дякую.

Відповіді:


242

Character.isDigit(string.charAt(index))( JavaDoc ) поверне true, якщо це цифра
Character.isLetter(string.charAt(index))( JavaDoc ) поверне true, якщо це літера


13
Зверніть увагу: вони визначають, чи символом є буква / цифра Unicode. ОП попросило "лист Аз" ... що б це не означало.
Стівен C

4
Чому в моєму випадку передається ASCII in (255)? Я думав, що це лише для Az, AZ та 0-9?
mr5

@ CᴏɴᴏʀO'Bʀɪᴇɴ Посилання тепер виправлені. Дякую що дали мені знати.
Адам

13
Використовуйте Character.isLetterOrDigit(string.charAt(index))для обох перевірок.
Аспірант9

Будьте уважні, isLetterOrDigit надає правдивий шлях більше, ніж a-Z0-9 !!! зверніться до doc тут docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w

24

Я шукаю функцію, яка перевіряє, чи це одна з латинських літер або десяткове число. З тих пір char c = 255, який у версії для друку є і розглядається як лист від Character.isLetter(c). Я думаю, що ця функція шукає більшість розробників:

private static boolean isLetterOrDigit(char c) {
    return (c >= 'a' && c <= 'z') ||
           (c >= 'A' && c <= 'Z') ||
           (c >= '0' && c <= '9');
}

1
Просто переглянув наш код і був вражений, скільки помилок було там через isLetter та isLetterOrDigit ... Дякую!
fl0w

1
Якось ви набули ваші набори символів і або відобразили шрифти, змішані. Unicode кодова точка u00ff- це насправді символ ÿ. (Малі регістри у з умлаутом.) Кодова точка, що представляє ├, є u251c.
Стівен С

@StephenC ти маєш рацію. Я забув, як закінчую вводити цього персонажа замість nbsp
mr5

На Котліні набагато простішеif (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
Влад

23

Оскільки відповіді вказують (якщо ви їх уважно вивчаєте!), Ваше питання неоднозначне. Що ви маєте на увазі під «літерою Аз» або цифрою?

  • Якщо ви хочете дізнатися, чи символом є літера чи цифра Unicode , то скористайтеся методами Character.isLetterта Character.isDigit.

  • Якщо ви хочете дізнатись, чи символ є буквою або цифрою ASCII , то найкраще зробити це перевірити, порівнявши з діапазонами символів 'a' до 'z', 'A' до 'Z' і '0' to '9'.

Зауважте, що всі букви / цифри ASCII - це літери / цифри Unicode ... але є багато символів / цифр Unicode, які не є ASCII. Наприклад, літери з наголосом, кирилиця, санскрит, ...


Загальне рішення полягає в наступному:

Character.UnicodeBlock block = Character.UnicodeBlock.of(someCodePoint);

а потім перевірити, чи є блок одним із тих, що вас цікавлять. У деяких випадках вам потрібно буде протестувати кілька блоків. Наприклад, є (принаймні) 4 блоки коду для символів кирилиці та 7 для латини. Character.UnicodeBlockКлас визначає статичні константи для добре відомих блоків; див. javadocs .

Зверніть увагу, що будь-яка точка коду буде мати щонайменше один блок.



8

Я не знаю про найкраще, але це здається мені досить простим:

Character.isDigit(str.charAt(index))
Character.isLetter(str.charAt(index))

Будьте уважні, isLetterOrDigit надає правдивий шлях більше, ніж a-Z0-9 !!! зверніться до doc тут docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w

5
// check if ch is a letter
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
    // ...

// check if ch is a digit
if (ch >= '0' && ch <= '9')
    // ...

// check if ch is a whitespace
if ((ch == ' ') || (ch =='\n') || (ch == '\t'))
    // ...

Джерело: https://docs.oracle.com/javase/tutorial/i18n/text/charintro.html


1
Попередній код помилковий, оскільки він працює лише з англійською та кількома іншими мовами. Щоб інтернаціоналізувати попередній приклад, замініть його такими твердженнями: char ch; // ... // Цей код нормально! якщо (Character.isLetter (ch)) // ... if (Character.isDigit (ch)) // ... if (Character.isSpaceChar (ch)) // ...
Яо Лі

ОП чітко запитав if a string.charAt(index) is an A-z letter. Тож ми не говоримо про інші мови, чи не так?
vadasambar

Наприклад, німецькою мовою, a може вважатися в діапазоні az.
Роберт

4

Порівняйте його значення. Він повинен бути між значеннями "a" і "z", "A" і "Z", "0" і "9"


1
Цей ручний підхід кращий за вбудований Character.isLetter()метод?
ІгорГанапольський

1
@IgorGanapolsky - Це залежить саме від того, що ви намагаєтеся зробити. Підказка: вони роблять різні речі!
Stephen C

@StephenC Я вважав Character.isLetter()рудиментарним. Якщо ми не говоримо про інтернаціоналізацію?
ІгорГанапольський

1
@IgorGanapolsky - Прочитайте javadocs. Потім перевірте специфікації Unicode, які точки-коди фактично містять відповідні класи символів. >> Звичайно << ми говоримо про інтернаціоналізацію. Персонажі на Java створені на основі Unicode.
Стівен C

як це робити?
John ktejik

3

Скористайтеся наведеним нижче кодом

Character.isLetterOrDigit(string.charAt(index))


1
Що додає ваша відповідь, яка не була висвітлена у попередніх відповідях?
Роберт

Будьте уважні, isLetterOrDigit надає правдивий шлях більше, ніж a-Z0-9 !!! зверніться до doc тут docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w

Роберт, замість того, щоб викликати дві функції, можна, звичайно, просто зателефонувати до однієї функції.
шейх

0
 import java.util.Scanner;
 public class v{
 public static void main(String args[]){
 Scanner in=new Scanner(System.in);
    String str;
    int l;
    int flag=0;
    System.out.println("Enter the String:");
    str=in.nextLine();
    str=str.toLowerCase();
    str=str.replaceAll("\\s","");
    char[] ch=str.toCharArray();
    l=str.length();
    for(int i=0;i<l;i++){
        if ((ch[i] >= 'a' && ch[i]<= 'z') || (ch[i] >= 'A' && ch[i] <= 'Z')){
        flag=0;
        }
        else

        flag++;
        break;
        } 
if(flag==0)
    System.out.println("Onlt char");


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