将用户的字符串输入限制为字母和数字值

时间:2010-06-22 06:32:51

标签: java validation java.util.scanner

基本上,我的情况要求我检查一下,用户从键盘输入定义的字符串在一种情况下只是字母字符,而在另一种情况下只是数字。这是用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只是数字,每个名称段都是按字母顺序排列的。

6 个答案:

答案 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;
        }

    }
}