【问题标题】:Check if String contains only letters检查字符串是否只包含字母
【发布时间】:2011-07-11 10:38:32
【问题描述】:

这个想法是读取一个字符串并验证它不包含任何数字字符。所以像“smith23”这样的东西是不可接受的。

【问题讨论】:

  • 如果您为字符串编写扩展方法,则可以内置检查。您也可以使用已经编写好的方法,例如 Extensions.cs NuGet 包,它使其变得如此简单:例如: "abcXYZ".IsAlphabetic() 将返回 True 而 "abc123".IsAlphabetic() 将返回 False。

标签: java string


【解决方案1】:

你想要什么?速度还是简单?为了速度,请选择基于循环的方法。为简单起见,请使用基于 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]+");
}

【讨论】:

  • 我这里可能悬而未决,但是“isLetter”和[a-zA-Z]不一样
  • 请记住,在 Java 中,char[] 将被编码为 UTF-16。这意味着当使用Character.isLetter(char) 单独检查时,多字符字形(其中两个字符都在代理范围内)将无法被识别为字母。 (参见docs.oracle.com/javase/7/docs/api/java/lang/…)相反,您需要使用String.codePointAt()Character.isLetter(int) 的组合。当然,如果您确定您的字符串中的字符在 ASCII 或扩展的单字符编码范围内,那么上述答案将有效。
  • Lambda 方法会更简单。
  • @IgorGanapolsky 需要 API 24 或更高版本。
  • @MaihanNijat 使用 RetroLambda
【解决方案2】:

Java 8 lambda 表达式。既快速又简单。

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

【讨论】:

  • 注意 allMatch 需要 API 级别 24
  • @capt.swag 这个问题一般是关于Java的,我相信你说“API level 24”时可能指的是Android
【解决方案3】:

或者,如果您使用的是 Apache Commons,[StringUtils.isAlpha()]

【讨论】:

    【解决方案4】:

    第一个导入模式:

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

    这将输出:

    不,检测到其他字符

    【讨论】:

      【解决方案5】:

      我使用了这个正则表达式(".*[a-zA-Z]+.*")。使用if not 语句,它将避免所有在任何类型的其他字符之前、结尾或之间有一个字母的表达式。

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

      【讨论】:

      • 开头和结尾的.* 不正确。由于它们可以是任意长度并包含数字,123smith123 将是一个有效的名称。不过,如果它只是字符串中的单个单词,像 ``^[a-zA-Z]+$` 这样的东西会起作用。
      • 我想我给出了错误的答案。你说的对。我的代码检查字符串是否没有任何字母。
      【解决方案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 字符串

      【讨论】:

      • 仅适用于英文
      【解决方案7】:
      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;
      }
      

      我知道这里有点拥挤。我在我的程序中使用它,并希望与人们分享它。它可以判断字符串中的任何字符是否不是字母。如果您想要一些易于澄清和回顾的内容,请使用它。

      【讨论】:

        【解决方案8】:

        下面是更快的方法。考虑到字母只有 a-z,A-Z。

        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
        

        【讨论】:

          【解决方案9】:

          检查这个,我想这对你有帮助,因为它在我的项目中工作,所以一旦你检查了这个代码

          if(! Pattern.matches(".*[a-zA-Z]+.*[a-zA-Z]", str1))
           {
             String not contain only character;
           }
          else 
          {
            String contain only character;
          }
          

          【讨论】:

            【解决方案10】:
                    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
                    }
            

            【讨论】:

            • 这是三年前@adarshr 发布的“简单”的更复杂的版本?
            【解决方案11】:

            尝试使用正则表达式:String.matches

            【讨论】:

              【解决方案12】:
              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;
              }
              

              【讨论】:

              • 这只会检查第一个字符!所以A12341 将返回true。 -1
              • @JanesAbouChleih,是的,你是对的。我已经编辑过了。请立即查看
              • 我删除了我的反对票。这个答案现在是正确的,但可以通过删除 continue 块轻松增强。 public boolean isAlpha(String name) { String s = name.toLowerCase(); for (int i = 0; i &lt; s.length(); i++) { if ((s.charAt(i) &lt; 'a' || s.charAt(i) &gt; 'z')) { return false; } } return true; }
              • 好的,非常感谢
              【解决方案13】:

              感觉好像我们需要找出字符是否只是字母。 以下是您可以解决的方法-

              Character.isAlphabetic(c) 
              

              有助于检查字符串的字符是否为字母。 其中c是

              char c = s.charAt(elementIndex);
              

              【讨论】:

                【解决方案14】:

                虽然有很多方法可以给这只猫换皮,但我更喜欢将这些代码包装到可重用的扩展方法中,这样以后做起来就很简单了。使用扩展方法时,您还可以避免使用 RegEx,因为它比直接字符检查要慢。我喜欢使用 Extensions.cs NuGet 包中的扩展。它使这项检查变得如此简单:

                1. https://www.nuget.org/packages/Extensions.cs 包添加到您的项目中。
                2. 将“using Extensions;”添加到代码顶部。
                3. "smith23".IsAlphabetic() 将返回 False,而 "john smith".IsAlphabetic() 将返回 True。默认情况下,.IsAlphabetic() 方法忽略空格,但它也可以被覆盖,这样"john smith".IsAlphabetic(false) 将返回 False,因为空格不被视为字母表的一部分。
                4. 其余代码中的所有其他检查都只是MyString.IsAlphabetic()

                【讨论】:

                  【解决方案15】:

                  要只允许 ASCII 字母,可以使用字符类 \p{Alpha}。 (这相当于[\p{Lower}\p{Upper}][a-zA-Z]。)

                  boolean allLettersASCII = str.matches("\\p{Alpha}*");
                  

                  要允许所有 Unicode 字母,请使用字符类 \p{L}(或等效的 \p{IsL})。

                  boolean allLettersUnicode = str.matches("\\p{L}*");
                  

                  请参阅Pattern documentation

                  【讨论】:

                    【解决方案16】:

                    我找到了一种简单的方法来检查字符串的所有数字是否都是字母。

                    public static boolean isStringLetter(String input) {
                    
                        boolean b = false;
                        for (int id = 0; id < input.length(); id++) {
                            if ('a' <= input.charAt(id) && input.charAt(id) <= 'z') {
                                b = true;
                            } else if ('A' <= input.charAt(id) && input.charAt(id) <= 'Z') {
                                b = true;
                            } else {
                                b = false;
                            }
                        }
                        return b;
                    }
                    

                    我希望它可以帮助任何正在寻找这种方法的人。

                    【讨论】:

                      【解决方案17】:

                      使用 StringUtils.isAlpha() 方法,它会让你的生活变得简单。

                      【讨论】:

                      • 这是该问题的另一个解决方案的副本。请考虑更新它以做一些不同的事情。
                      猜你喜欢
                      • 2013-03-08
                      • 2015-01-04
                      • 1970-01-01
                      • 2017-11-02
                      • 2012-08-20
                      • 1970-01-01
                      • 2020-12-12
                      • 2014-07-16
                      相关资源
                      最近更新 更多