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);
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。