Как лучше всего без использования регулярных выражений определить, является ли символ буквой или цифрой в Java?


125

Каков наилучший и / или самый простой способ распознать, является ли string.charAt (index) буквой Az или числом в Java без использования регулярных выражений? Спасибо.

Ответы:


243

Character.isDigit(string.charAt(index))( JavaDoc ) вернет истину, если это цифра
Character.isLetter(string.charAt(index))( JavaDoc ) вернет истину, если это буква


13
Примечание: они сообщают вам, является ли символ буквой / цифрой Unicode. ОП попросил "букву аз" ... что бы это ни значило.
Stephen C

4
Почему ASCII ├ (255) проходит в моем случае? Я думал, это только для az, AZ и 0-9?
mr5

@ CᴏɴᴏʀO'Bʀɪᴇɴ Ссылки теперь исправлены. Спасибо, что дал мне знать.
Адам

14
Используйте Character.isLetterOrDigit(string.charAt(index))для обеих проверок.
Aspirant9

Будьте осторожны, isLetterOrDigit выдает истинное значение больше, чем a-Z0-9 !!! обратитесь к документу здесь docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w 06

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 06

1
Каким-то образом вы перепутали свои наборы символов и / или отображаемые шрифты. Кодовая точка Unicode u00ff- это фактически символ ÿ. (Буква y в нижнем регистре с умляутом.) Код, представляющий, - u251c.
Stephen C,

@StephenC, ты прав. Я забыл, как я
набираю

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

23

Как показывают ответы (если вы внимательно их изучите!), Ваш вопрос неоднозначен. Что вы подразумеваете под «буквой Az» или цифрой?

  • Если вы хотите знать , если символ является Unicode буква или цифра, а затем использовать Character.isLetterи Character.isDigitметоды.

  • Если вы хотите узнать, является ли символ буквой или цифрой ASCII , то лучше всего проверить, сравнив с диапазонами символов от «a» до «z», от «A» до «Z» и от «0» до '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 !!! обратитесь к документу здесь docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w 06

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; // ... // Этот код в порядке! if (Character.isLetter (ch)) // ... if (Character.isDigit (ch)) // ... if (Character.isSpaceChar (ch)) // ...
Яо Ли

- ясно спросил ОП if a string.charAt(index) is an A-z letter. Так мы ведь не говорим о других языках?
vadasambar

Например, в немецком языке ä можно рассматривать как находящееся в диапазоне аз.
Роберт

4

Сравните его ценность. Он должен быть между значениями «a» и «z», «A» и «Z», «0» и «9».


1
Этот ручной подход лучше встроенного Character.isLetter()?
Игорь Ганапольский

1
@IgorGanapolsky - Это зависит именно от того, что вы пытаетесь сделать. Подсказка: они делают разные вещи!
Stephen C

@StephenC Я думал, что Character.isLetter()это элементарно. Разве мы говорим об интернационализации?
Игорь Ганапольский

1
@IgorGanapolsky - Прочтите javadocs. Затем проверьте спецификации Unicode, какие кодовые точки действительно содержат соответствующие классы символов. >> Конечно << речь идет об интернационализации. Все символы в Java основаны на Юникоде.
Stephen C

как ты это делаешь?
john ktejik 05

3

Используйте приведенный ниже код

Character.isLetterOrDigit(string.charAt(index))


1
Что ваш ответ добавляет, чего не было в предыдущих ответах?
Роберт

Будьте осторожны, isLetterOrDigit выдает истинное значение больше, чем a-Z0-9 !!! обратитесь к документу здесь docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w 06

Роберт, вместо вызова двух функций вы, конечно, можете просто вызвать одну функцию.
шейх

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.