具有正则表达式的Java的StringTokenizers

时间:2015-04-13 20:41:28

标签: java regex stringtokenizer

我正在开发一个项目,要求用户输入7个信息元素(一次全部用逗号分隔)。如果输入了任何无效字段,则显示一条消息并要求用户再次输入该字段。如果所有的信息。输入正确。显示所有字段,每行一个带标签的字段。这是我到目前为止所得到的:

import java.util.Scanner;

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

        System.out.println("Please enter first name: ");
        String firstName = scanner.nextLine();
        System.out.println("Please enter last name: ");
        String lastName = scanner.nextLine();
        System.out.println("Please enter address: ");
        String address = scanner.nextLine();
        System.out.println("Please enter city: ");
        String city = scanner.nextLine();
        System.out.println("Please enter state: ");
        String state = scanner.nextLine();
        System.out.println("Please enter zipcode: ");
        String zip = scanner.nextLine();
        System.out.println("Please enter phone: ");
        String phone = scanner.nextLine();

        System.out.println("\nValidate Result:");

        if (!validateFirstName(firstName))
            System.out.println("Invalid first name");
        else if (!validateLastName(lastName))
            System.out.println("Invalid last name");
        else if (!validateAddress(address))
            System.out.println("Invalid address");
        else if (!valiadteCity(city))
            System.out.println("Invalid city");
        else if (!validateState(state))
            System.out.println("Invalid state");
        else if (!validateZip(zip))
            System.out.println("Invalid zipcode ");
        else if (!validatePhone(phone))
            System.out.println("Invalid phone");
        else
            System.out.println("Valid input. Thank you!");
    }
    public static boolean validateFirstName(String firstName)
    {
        return firstName.matches("[A-Z][a-zA-Z]*");
    }        
    public static boolean validateLastName(String lastName)
    {
        return lastName.matches("[a-zA-z]+(['-][a-zA-Z]+)*");
    }
    public static boolean validateAddress(String address)
    {
        return address.matches("\\d+\\s+([a-zA-Z]+|[a-zA-Z]+\\s[a-zA-Z]+)");
    }        
    public static boolean valiadteCity(String city)
    {
        return city.matches("([a-zA-Z]+|[a-zA-Z]+\\s[a-zA-Z]+)");
    }        
    public static boolean validateState(String state)
    {
        return state.matches("([a-zA-Z]+|[a-zA-Z]+\\s[a-zA-Z]+)");
    }        
    public static boolean validateZip(String zip)
    {
        return zip.matches("\\d{5}");
    }        
    public static boolean validatePhone(String phone)
    {
        return phone.matches("[1-9]\\d{2}-[1-9]\\d{2}-\\d{4}");
    }
}

我是Java的新手,我真的不知道如何为StringTokenizers做什么。我上面的代码使用了基本输入。但是,我为此写了一小部分,但不确定,也不知道在哪里放。

System.out.println("Enter info. separated by comma: ");
String sentence = scanner.nextLine();

String[] tokens = sentence.split(",");
System.out.printf("Number of elements: %d%nThe tokens are:%n", tokens.length);

for (String token : tokens)
    System.out.println(token);

我想出了两个问题:

  
      
  1. 我不知道我的代码在StringTokenizers的位置/方式。
  2.   
  3. 如果信息输入正确,如何显示所有字段?
  4.   

如果您能对我的代码进行正确解释,那就太好了。因为我是新人,不知道该怎么做。非常感谢你!

1 个答案:

答案 0 :(得分:0)

StringTokenizer用于使用指定的分隔符将输入字符串拆分为标记。 对于你知道元素序列的这类任务,对于每个元素都有预定义的验证,我宁愿避免使用循环。

任务的主要思想是首先将输入字符串拆分为元素数组,然后执行验证。

String input = scanner.nextLine();
String[] elements = input.split(',');
if (elements.length != 7) { 
    System.out.println("Invalid input string");
    System.exit(0);    
}

String firstName = elements[0];
while (!validateFirstName(firstName)) {
    System.out.println("Please enter first name: ");
    firstName = scanner.nextLine();
}

String secondName = elements[1];
while (!validateSecondName(secondName)) {
    System.out.println("Please enter second name: ");
    secondName = scanner.nextLine();
}
// ... The same logic for the other fields.