อะไรคือวิธีที่ดีที่สุดในการบอกว่าอักขระเป็นตัวอักษรหรือตัวเลขใน Java โดยไม่ใช้ regexes


125

อะไรคือวิธีที่ดีที่สุดและ / หรือง่ายที่สุดในการรับรู้ว่า string.charAt (index) เป็นตัวอักษร Az หรือตัวเลขใน Java โดยไม่ต้องใช้นิพจน์ทั่วไป ขอบคุณ

คำตอบ:


243

Character.isDigit(string.charAt(index))( JavaDoc ) จะคืนค่าจริงหากเป็นตัวเลข
Character.isLetter(string.charAt(index))( JavaDoc ) จะคืนค่าจริงหากเป็นตัวอักษร


13
หมายเหตุ: สิ่งเหล่านี้จะบอกคุณว่าอักขระนั้นเป็นตัวอักษร / ตัวเลข Unicode หรือไม่ OP ขอ "ตัวอักษร Az" ... ไม่ว่าจะหมายถึงอะไร
Stephen C

4
ทำไม ASCII ├ (255) ถึงผ่านในกรณีของฉัน ฉันคิดว่าสำหรับ az, AZ และ 0-9 เท่านั้น?
mr5

ลิงก์ @ CᴏɴᴏʀO'Bʀɪᴇɴได้รับการแก้ไขแล้ว ขอบคุณสำหรับการให้ฉันรู้ว่า.
Adam

14
ใช้Character.isLetterOrDigit(string.charAt(index))สำหรับทั้งการยืนยัน
Aspirant9

ระวัง isLetterOrDigit ให้จริงมากกว่า a-Z0-9 !!! ดูเอกสารที่นี่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 codepoint u00ffเป็นอักขระÿ (กรณีที่ต่ำกว่าปีที่มีเครื่องหมาย.) The u251cจุดโค้ดที่แสดงถึง├คือ
Stephen C

@StephenC คุณพูดถูก ฉันลืมวิธีการที่ฉันจบลงด้วยการพิมพ์ตัวอักษรแทนการที่nbsp
mr5

บน Kotlin นั้นง่ายกว่ามากif (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
Vlad

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

โปรดทราบว่าจุดรหัสใด ๆ จะอยู่ในที่มากที่สุดบล็อกหนึ่ง




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)) // ...
Yao Li

OP if a string.charAt(index) is an A-z letterถามอย่างชัดเจน เราจึงไม่ได้พูดถึงภาษาอื่น ๆ ใช่หรือไม่?
vadasambar

ตัวอย่างเช่นภาษาเยอรมันäอาจถือได้ว่าอยู่ในช่วง az
Robert

4

เปรียบเทียบมูลค่า ควรอยู่ระหว่างค่าของ 'a' และ 'z', 'A' และ 'Z', '0' และ '9'


1
แนวทางด้วยตนเองนี้ดีกว่าCharacter.isLetter()วิธีการในตัวหรือไม่?
IgorGanapolsky

1
@IgorGanapolsky - มันขึ้นอยู่กับสิ่งที่คุณพยายามทำ คำแนะนำ: พวกเขาทำสิ่งที่แตกต่าง!
Stephen C

@StephenC ฉันคิดว่าCharacter.isLetter()เป็นพื้นฐาน เว้นแต่เราจะพูดถึงความเป็นสากล?
IgorGanapolsky

1
@IgorGanapolsky - อ่าน Javadocs จากนั้นตรวจสอบข้อกำหนดของ Unicode สำหรับโค้ดชี้ที่คลาสอักขระตามลำดับมีอยู่จริง >> แน่นอน << เรากำลังพูดถึงความเป็นสากล อักขระใน Java ล้วนใช้ Unicode
Stephen C

คุณจะทำอย่างไร?
john ktejik

3

ใช้รหัสด้านล่าง

Character.isLetterOrDigit(string.charAt(index))


1
คำตอบของคุณเพิ่มอะไรที่ไม่ได้กล่าวถึงในคำตอบก่อนหน้านี้?
Robert

ระวัง isLetterOrDigit ให้จริงมากกว่า a-Z0-9 !!! ดูเอกสารที่นี่docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w

Robert แทนที่จะเรียกสองฟังก์ชันคุณสามารถเรียกใช้ฟังก์ชันเดียวได้
Sheikh

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


}
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.