【问题标题】:Check if a string contains only a set of letters检查字符串是否只包含一组字母
【发布时间】:2013-03-08 21:55:24
【问题描述】:

我正在尝试检查一个单词是否仅包含一组字母,例如 I、O、S、H 和 X 假设用户输入:SSHX,输出是yes,如果用户输入SHEXX,输出是NO

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    String word = sc.next();
    word = word.toUpperCase();

    int length = word.length();
    char letter = 0;

    for (int counter = 0; counter < length; counter++) {
        letter = word.charAt(counter);
    }
    if (letter != 'I' && letter != 'O' && letter != 'S' && letter != 'H' && letter != 'Z' && letter != 'X' && letter != 'N') {
        System.out.print("NO");
    } else {
        System.out.print("YES");
    }
}

【问题讨论】:

  • 正则表达式是最简单的解决方案,但如果您想知道为什么您的方法不起作用,那是因为您没有在 for 循环中测试任何内容。您可以在调试器中自己查看。

标签: java string char


【解决方案1】:

你有一个很好的方法来解决它。问题是您实际上并没有检查每个字母,因此您需要在 for 循环内进行检查,否则您只会检查最后一个字母。但是您不能打印“是”,因为您只想在所有字母都是“是”时打印它,因此您也可以使用布尔值来检查它,例如:

    boolean isMatch = true; 
    for (int counter = 0; counter < strLength && isMatch; counter++) {
        letter = word.charAt(counter);
        if (letter != 'I' && letter != 'O' && letter != 'S' && letter != 'H' && letter != 'Z' && letter != 'X' && letter != 'N') {
            System.out.print("NO");
            isMatch = false;
        } 
    }
    if (isMatch) {
        System.out.print("YES");
    }

但是,正如其他人所指出的那样,使用正则表达式更有效(并且这个表达式有一个可以满足您想要的工作的正则表达式。星号表示括号内的内容为零或多个。):

    if (word.matches("[HIOSX]*")) {
        System.out.print("YES");
    } else {
        System.out.print("NO");
    }

【讨论】:

    【解决方案2】:

    除了使用正则表达式这个显而易见的答案之外,考虑使用 Google 的 Guava API 来简化此操作:

    if(CharMatcher.anyOf("HIOSX").matchesAllOf(word)) { 
    
    } ...
    

    【讨论】:

    • 我想你想要反过来:CharMatcher.anyOf("HIOSX").matchesAllOf(word)
    【解决方案3】:

    使用regular expression

    String regex = "[OSXHI]*";
    String string = "SOMETHING";
    Matcher matcher = Pattern.compile(regex).matcher(string);
    if (matcher.find())
    {
        String match = matcher.group(1);
        System.out.println(match);
    }
    

    一些额外的资源:

    【讨论】:

    • 从另一个答案复制粘贴的评论: 您的正则表达式将只匹配一个字符的字符串(这确实应该在列出的字符中)。您需要添加一个* 以使其匹配多字符单词。
    • 如果你注意到的话,我是第一个回答的。感谢您的建议。
    • 我没注意到,对不起...“复制/粘贴”部分是另一个答案... :)
    【解决方案4】:

    使用正则表达式:

    if (word.matches("[HIOSX]+"))
        System.out.println("YES");
    else
        System.out.println("NO");
    

    【讨论】:

    • 您的正则表达式将只匹配一个字符的字符串(这确实应该在列出的字符中)。您需要添加一个* 以使其匹配多字符单词。
    • 谢谢。其实应该是+,防止空字符串匹配。
    【解决方案5】:

    首先你应该像这样初始化字母: char letter = '0'; 而不是 0 第二个你的 for 循环使用不当试试这个代码:

     boolean isInSet;
        for (int counter = 0; counter < strLength; counter++) 
        {
            letter = word.charAt(counter);
            if (letter != 'I' && letter != 'O' && letter != 'S' && letter != 'H' && letter != 'Z' && letter != 'X' && letter != 'N') 
            {
                isInSet=false;
                counter=strlength; //end loop
            } 
            else 
            {
               isInSet=true;
            }
        }
        if(isInSet=true)
        {
           System.out.print("YES");
        }
        else
        {
           System.out.print("NO");
        }
    

    现在循环将遍历字符串并检查每个字符是否在集合中,如果不是,则循环结束并将布尔值设置为 false,从而导致 NO 输出

    【讨论】:

      猜你喜欢
      • 2011-07-11
      • 2015-01-04
      • 1970-01-01
      • 2017-11-02
      • 2012-08-20
      • 1970-01-01
      • 2012-05-01
      • 2020-12-12
      相关资源
      最近更新 更多