基本上,我的情况要求我检查一下,用户从键盘输入定义的字符串在一种情况下只是字母字符,而在另一种情况下只是数字。这是用Java编写的。
我目前的代码:
switch (studentMenu) {
case 1: // Change all four fields
System.out.println("Please enter in a first name: ");
String firstNameIntermediate = scan.next();
firstName = firstNameIntermediate.substring(0,1).toUpperCase() + firstNameIntermediate.substring(1);
System.out.println("Please enter in a middle name");
middleName = scan.next();
System.out.println("Please enter in a last name");
lastName = scan.next();
System.out.println("Please enter in an eight digit student ID number");
changeID();
break;
case 2: // Change first name
System.out.println("Please enter in a first name: ");
firstName = scan.next();
break;
case 3: // Change middle name
System.out.println("Please enter in a middle name");
middleName = scan.next();
break;
case 4: // Change last name
System.out.println("Please enter in a last name");
lastName = scan.next();
case 5: // Change student ID:
changeID();
break;
case 6: // Exit to main menu
menuExit = true;
default:
System.out.println("Please enter a number from 1 to 6");
break;
}
}
}
public void changeID() {
studentID = scan.next();
}
我需要确保StudentID只是数字,每个名称段都是按字母顺序排列的。
答案 0 :(得分:5)
java.util.Scanner
已经可以使用hasNextXXX
方法检查下一个令牌是否属于给定的模式/类型。
以下是使用boolean hasNext(String pattern)
使用正则表达式[A-Za-z]+
来验证下一个标记仅由字母组成的示例:
Scanner sc = new Scanner(System.in);
System.out.println("Please enter letters:");
while (!sc.hasNext("[A-Za-z]+")) {
System.out.println("Nope, that's not it!");
sc.next();
}
String word = sc.next();
System.out.println("Thank you! Got " + word);
这是一个示例会话:
<强>
Please enter letters:
强>
&#@#$
的Nope, that's not it!
强>
123
的Nope, that's not it!
强>
james bond
Thank you! Got james
要验证下一个令牌是否可以转换为int
,请使用hasNextInt()
然后nextInt()
。
答案 1 :(得分:4)
使用正则表达式执行此操作可能最简单。这是一些示例代码:
import java.util.regex.*;
public class Test
{
public static void main(String[] args) throws Exception
{
System.out.println(isNumeric("123"));
System.out.println(isNumeric("abc"));
System.out.println(isNumeric("abc123"));
System.out.println(isAlpha("123"));
System.out.println(isAlpha("abc"));
System.out.println(isAlpha("abc123"));
}
private static final Pattern NUMBERS = Pattern.compile("\\d+");
private static final Pattern LETTERS = Pattern.compile("\\p{Alpha}+");
public static final boolean isNumeric(String text)
{
return NUMBERS.matcher(text).matches();
}
public static final boolean isAlpha(String text)
{
return LETTERS.matcher(text).matches();
}
}
您应该编写“getAlphaInput”和“getNumericInput”方法,这些方法执行相应的提示/获取/检查循环,直到输入正确为止。或者可能只是getInput(Pattern)
以避免为不同的模式编写类似的代码。
你还应该围绕什么算作“字母”来解决 - 上面只做az和AZ ......如果你还需要处理重音等,你应该仔细看看{{1}文档和适当的适应。
请注意,您也可以使用正则表达式来验证字符串长度等内容。他们非常灵活。
答案 2 :(得分:0)
我不确定这是最好的方法,但你可以像这样使用Character.isDigit()和Character.IsLiteral()mabybe:
for( char c : myString.toCharArray() ) {
if( !Character.isLiteral(c) ) {
//
}
}
答案 3 :(得分:0)
我认为您不能阻止用户输入无效值,但您可以选择验证收到的数据。我是正则表达的粉丝。真的很快,可能是这样的(所有值都初始化为空字符串):
while (!firstName.matches("^[a-zA-Z]+$")) {
System.out.println("Please enter in a first name");
firstName = scan.next();
}
...
while (!studentID.matches("^\\d{8}$")) {
System.out.println("Please enter in an eight digit student ID number");
changeID();
}
如果你走这条路,你可以对需要验证的不同情况进行分类,并创建一些辅助方法来处理每个。
“正则表达式”在开始时似乎势不可挡,但学习它具有很大的价值,并且不乏教程。
答案 4 :(得分:0)
试试regexp:\ d + - 数字,[A-Za-z] + - 按字母顺序排列
答案 5 :(得分:0)
这就是代码
public class InputLetters {
String InputWords;
Scanner reader;
boolean [] TF;
boolean FT;
public InputLetters() {
FT=false;
while(!FT){
System.out.println("Enter that you want to: ");
reader = new Scanner(System.in);
InputWords = reader.nextLine();
Control(InputWords);
}
}
public void Control(String s){
String [] b = s.split(" ");
TF = new boolean[b.length];
for(int i =0;i<b.length;i++){
if(b[i].matches("^[a-zA-Z]+$")){
TF[i]=true;
}else
{
TF[i]=false;
}
}
for(int j=0;j<TF.length;j++){
if(!TF[j]){
FT=false;
System.out.println("Enter only English Characters!");
break;
}else{
FT=true;
}
}
}