Kiểm tra xem Chuỗi chỉ chứa các chữ cái


81

Ý tưởng là để một Chuỗi được đọc và xác minh rằng nó không chứa bất kỳ ký tự số nào. Vì vậy, một cái gì đó như "smith23" sẽ không được chấp nhận.

Câu trả lời:


137

Bạn muốn gì? Tốc độ hay sự đơn giản? Đối với tốc độ, hãy sử dụng cách tiếp cận dựa trên vòng lặp. Để đơn giản, hãy sử dụng phương pháp dựa trên RegEx một lớp lót.

Tốc độ

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

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

    return true;
}

Sự đơn giản

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

15
Tôi có thể pendantic ở đây, nhưng "isLetter" là không giống như [a-zA-Z]
krosenvold

4
Hãy nhớ rằng trong Java, a char[]sẽ được mã hóa là UTF-16. Điều này có nghĩa là một glyph gồm nhiều ký tự (trong đó cả hai ký tự đều nằm trong phạm vi thay thế) sẽ không được nhận dạng là một chữ cái khi được kiểm tra bằng cách sử dụng riêng lẻ Character.isLetter(char). (Xem docs.oracle.com/javase/7/docs/api/java/lang/… ) Thay vào đó, bạn cần sử dụng kết hợp String.codePointAt()Character.isLetter(int). Tất nhiên, nếu bạn biết chắc chắn rằng các ký tự trong chuỗi của bạn nằm trong ASCII hoặc các phạm vi được mã hóa một ký tự đơn lẻ mở rộng, thì câu trả lời trên sẽ hoạt động.
Ionoclast Brigham

1
Cách tiếp cận Lambda sẽ còn đơn giản hơn.
IgorGanapolsky

1
@IgorGanapolsky yêu cầu API 24 trở lên.
Maihan Nijat

@MaihanNijat sử dụng RetroLambda
IgorGanapolsky

72

Java 8 biểu thức lambda. Vừa nhanh vừa đơn giản.

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

7
Lưu ý rằng allMatch đòi hỏi mức API 24
capt.swag


9

Mẫu nhập đầu tiên:

import java.util.regex.Pattern;

Sau đó, sử dụng mã đơn giản này:

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

Điều này sẽ xuất ra:

Không, đã phát hiện các ký tự khác


6

Tôi đã sử dụng biểu thức regex này (".*[a-zA-Z]+.*"). Với if notcâu lệnh, nó sẽ tránh tất cả các biểu thức có một chữ cái ở trước, ở cuối hoặc giữa bất kỳ loại ký tự nào khác.

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

những .*lúc bắt đầu và kết thúc của nó là không đúng. Vì chúng có thể dài bất kỳ và bao gồm các chữ số, 123smith123sẽ là một tên hợp lệ. Tuy nhiên, một cái gì đó như `` ^ [a-zA-Z] + $ `sẽ hoạt động nếu nó chỉ là một từ duy nhất trong chuỗi.
Andris Leduskrasts

Tôi đoán tôi đã trả lời sai. Bạn đúng rồi. Mã của tôi kiểm tra xem Chuỗi không có bất kỳ chữ cái nào.
iyas

6

Một cách nhanh chóng để làm điều đó là:

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

Vì bạn không cần phải chạy toàn bộ aStringđể kiểm tra xem nó có phải là Chuỗi alpha hay không .


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

Tôi biết nó hơi đông đúc. Tôi đang sử dụng nó với chương trình của mình và cảm thấy muốn chia sẻ nó với mọi người. Nó có thể cho biết nếu bất kỳ ký tự nào trong một chuỗi không phải là một chữ cái hay không. Sử dụng nó nếu bạn muốn điều gì đó dễ dàng làm rõ và nhìn lại.


4

Cách nhanh hơn là bên dưới. Xét các chữ cái chỉ là 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;
    }

Thời gian chạy được tính bằng nano giây. Nó có thể khác nhau giữa hệ thống.

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

4

Hãy kiểm tra cái này, tôi đoán nó sẽ giúp bạn vì nó hoạt động trong dự án của tôi nên khi bạn kiểm tra mã này

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
Đó là phiên bản phức tạp hơn của thứ "Đơn giản" mà @adarshr đã đăng ba năm trước?
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
Điều này chỉ kiểm tra char đầu tiên! Vì vậy, A12341sẽ trở lại true. -1
jAC

@JanesAbouChleih, vâng bạn đã đúng. Tôi đã chỉnh sửa nó. Vui lòng kiểm tra tại
Surender Singh

Tôi đã xóa phiếu phản đối của mình. Câu trả lời này hiện đúng, nhưng có thể dễ dàng nâng cao bằng cách loại bỏ continuekhối. 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

Vâng, cám ơn rất nhiều
Surender Singh

-1

Sử dụng phương thức StringUtils.isAlpha () và nó sẽ giúp cuộc sống của bạn trở nên đơn giản.


1
đây là một bản sao của một giải pháp khác cho câu hỏi. Vui lòng xem xét cập nhật nó để làm điều gì đó khác biệt.
Frayal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.