Java 输入字符串,如果不';行不通

Java 输入字符串,如果不';行不通,java,string,if-statement,input,Java,String,If Statement,Input,我有以下问题: 用户必须在我的程序中正确输入其姓名: 名称仅包含字母、连字符“-”和空格 第一个字母应该是大写字母 空格或连字符后应后跟大写字母 例如,程序仅接受此表格: “Name”或“Firstname Secondname”或“Firstname Secondname” 第三点在我的代码中不起作用:( 我的Java代码: public class Test { private static Scanner scanner = new Scanner(System.in);

我有以下问题:

用户必须在我的程序中正确输入其姓名:

  • 名称仅包含字母、连字符“-”和空格
  • 第一个字母应该是大写字母
  • 空格或连字符后应后跟大写字母
  • 例如,程序仅接受此表格:

    “Name”或“Firstname Secondname”或“Firstname Secondname”

    第三点在我的代码中不起作用:(

    我的Java代码:

    public class Test {
        private static Scanner scanner = new Scanner(System.in);
        private static String name;
    
        public static void main(String[] args) {
    
            boolean check = false;
    
            check = checkName();
            System.out.println("Check= "+check);
            output(check);
    
        }
    
            public static void output(boolean check) {
                if (check == false) {
                    System.out.println("Fehler");
                }   
                if(check == true) {
                    System.out.println("Dein Name ist: "+name);
                } 
            }//End output()
    
        public static boolean checkName() {
    
            System.out.print("Name: ");
            name = scanner.nextLine();
            boolean check = false;
    
            if(name.charAt(0) >= 'A' && name.charAt(0) <= 'Z') {
    
                for(int i=1; i < name.length(); i++) {
                    if (name.charAt(i) >= 'a' && name.charAt(i) <= 'z') {                       
                        check = true;
                    } else if (name.charAt(i) == '-') {             
                        i++;
                        if(name.charAt(i) >= 'A' && name.charAt(i) <= 'Z') {
                            check = true;                                               
                        } else {
                            check = false;
                        }
                    } else if (name.charAt(i) == ' ') {
                        i++;
                        if(name.charAt(i) >= 'A' && name.charAt(i) <= 'Z') {
                            check = true;
                        } else { check = false;
                        }} else { 
                            check = false;
                            break;
                        }
                } 
            } return check;
    
    
    
    
        }//End checkName()
    
    公共类测试{
    专用静态扫描仪=新扫描仪(System.in);
    私有静态字符串名;
    公共静态void main(字符串[]args){
    布尔检查=假;
    check=checkName();
    System.out.println(“Check=“+Check”);
    输出(检查);
    }
    公共静态无效输出(布尔检查){
    如果(检查==false){
    System.out.println(“费勒”);
    }   
    如果(检查==true){
    System.out.println(“设计名称列表:“+Name”);
    } 
    }//结束输出()
    公共静态布尔校验名(){
    系统输出打印(“名称:”);
    name=scanner.nextLine();
    布尔检查=假;
    
    如果(name.charAt(0)>='A'&&name.charAt(0)='A'&&name.charAt(i)='A'&&name.charAt(i)='A'&&name.charAt(i),这看起来是使用正则表达式的好地方。下面的示例如何:

    String name = scanner.nextLine();
    if (Pattern.compile("^[A-Z][a-z]*(?:(?: |-)[A-Z][a-z]*)?$").matcher(name).find()) {
      // Valid Name
    }
    
    这将检查变量
    name
    与正则表达式是否匹配。要解释正则表达式,请执行以下操作:

    ^
    这表示字符串的开头

    [A-Z][A-Z]*
    这表示大写字母后跟零个或多个小写字母

    ((?:|-)[A-Z][A-Z]*)?
    这意味着后面跟一个空格或连字符,大写字母后跟可选的小写字符-此部分是可选的,因为组后面跟一个

    $
    这表示字符串结束


    您还可以使用更简单的
    String.matches()
    ,而不是
    Pattern.compile().matcher()
    ,这看起来是使用正则表达式的好地方。下面的示例如何:

    String name = scanner.nextLine();
    if (Pattern.compile("^[A-Z][a-z]*(?:(?: |-)[A-Z][a-z]*)?$").matcher(name).find()) {
      // Valid Name
    }
    
    这将检查变量
    name
    与正则表达式是否匹配。要解释正则表达式,请执行以下操作:

    ^
    这表示字符串的开头

    [A-Z][A-Z]*
    这表示大写字母后跟零个或多个小写字母

    ((?:|-)[A-Z][A-Z]*)?
    这意味着后面跟一个空格或连字符,大写字母后跟可选的小写字符-此部分是可选的,因为组后面跟一个

    $
    这表示字符串结束


    您还可以使用更简单的
    String.matches()
    ,而不是
    Pattern.compile().matcher()

    您需要正则表达式来实现它。请正确缩进您的代码。去掉该
    检查
    变量。您应该只
    返回false;
    当前设置的任何地方
    检查=false
    。并用checkName方法结尾的
    返回检查;
    替换
    返回false;
    。Af在
    for
    循环中添加一个
    return true;
    ,但是老实说,你的
    i++
    会有其他问题,导致你的字符串结束。正如其他人所说,正则表达式工作得很好,但根据你所写的代码,这对你来说可能有点高级。@neildo所说的实际上是原因关于yopur问题。你的问题不仅仅是案例3,而是当你发现一个无效的字符时,你不会立即返回false。想想看:你在字符串中循环,比如说在位置2它会发现一些无效的东西,并将check设置为false。然后你只需继续到位置3,如果这是有效的,检查将是set再次设置为true。一旦找到一个位置为false,您必须立即返回false。您需要正则表达式来实现它。请正确缩进您的代码。去掉该
    检查
    变量。您应该只
    返回false;
    当前设置的任何位置
    检查=false
    。并替换
    返回检查;在checkName方法的末尾使用
    return false;
    。在
    for
    循环之后,添加一个
    return true;
    ,但是老实说,你的
    i++
    会有其他问题,导致你的字符串用完。就像其他人说的,regex可以很好地工作,但这对你来说可能有点高级您基于您编写的代码。@neildo所说的实际上是yopur问题的原因。您的问题不仅仅是案例3,而是当您发现一个无效字符时不会立即返回false。想想看:您循环遍历字符串,比如在位置2,它会发现一些无效的内容,并将check设置为false。您不会这样做然后继续转到位置3,如果这是有效的,检查将再次设置为true。一旦找到1个位置为false,您必须立即返回false。