检查字符串是否仅包含字母


81

这个想法是读取一个String并验证它不包含任何数字字符。因此,“ smith23”之类的内容将不被接受。

Answers:


137

你想要什么?速度还是简单?为了提高速度,请使用基于循环的方法。为简单起见,请使用一种基于内衬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中,achar[]将被编码为UTF-16。这意味着当使用单独检查时,多字符字形(两个字符都在代理范围内)将不会被识别为字母Character.isLetter(char)。(见docs.oracle.com/javase/7/docs/api/java/lang/...)相反,你需要使用的组合String.codePointAt()Character.isLetter(int)。当然,如果您确定您的字符串中的字符位于ASCII或扩展的单字符编码范围内,则上述答案将起作用。
Ionoclast Brigham 2014年

1
Lambda方法将更加简单。
IgorGanapolsky'3

1
@IgorGanapolsky需要API 24或更高版本。
Maihan Nijat

@MaihanNijat使用RetroLambda
IgorGanapolsky



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 notstatement可以避免所有在任何其他类型的字符之前,结尾或之间都带有字母的表达式。

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

.*的开头和结尾不正确。由于它们可以是任意长度,并且包含数字,因此123smith123将是有效名称。如果只是字符串中的单个单词,则类似“ ^ [a-zA-Z] + $`”的方法也可以使用。
Andris Leduskrasts

我想我回答错了。你是对的。我的代码检查String是否没有字母。
2015年

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来检查它是否不是alpha字符串


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,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发布的“ Simplicity”事情的更复杂版本吗?
mabi 2014年


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.