如何在Java中使用破折号指定数字模式?



对于这段代码,我试图让用户输入一个数字模式,如"####-##-###"包括破折号。我有这个代码,但是它返回一个错误。

import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.Scanner;
public class StudentNumber {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("Enter your student number: ");
int su;
Pattern p = Pattern.compile("[\d]{4,}+[-?]{1,1}+[\d]{2,}+[-?]{1,1}+[\d]{3,}");
su = s.nextInt();
String input = String.valueOf(su);
Matcher m = p.matcher(input);
if (m.matches()){
System.out.println("You have successfully logged in.nWelcome to your new dashboard!");
} else {
System.out.println("Invalid format. Try Again.");
}
}
}

错误是

Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:943)
at java.base/java.util.Scanner.next(Scanner.java:1598)
at java.base/java.util.Scanner.nextInt(Scanner.java:2263)
at java.base/java.util.Scanner.nextInt(Scanner.java:2217)
at com.mycompany.studentnumber.StudentNumber.main(StudentNumber.java:21)

你得到的错误是因为你在字符串中有破折号并且你正在调用nextInt。您需要将输入读取为字符串(例如nextLine),然后将正则表达式应用于该字符串,并酌情将部分转换为整数。

su = s.nextInt();

由于您期望的输入包含破折号,即-,它不是int,它是一个字符串,所以使用方法nextLine(而不是方法nextInt)。

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StudentNumber {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("Enter your student number: ");
Pattern p = Pattern.compile("[\d]{4,}+[-?]{1,1}+[\d]{2,}+[-?]{1,1}+[\d]{3,}");
String input = s.nextLine();
Matcher m = p.matcher(input);
if (m.matches()){
System.out.println("You have successfully logged in.nWelcome to your new dashboard!");
} else{
System.out.println("Invalid format. Try Again.");
}
}
}

下面是示例运行的输出:

Enter your student number: 123-456-789
Invalid format. Try Again.

下面是另一个示例:

Enter your student number: 1234-56-789
You have successfully logged in.
Welcome to your new dashboard!

由于您在int输入中使用-,因此输入不能将其作为整数,而是使用Scanner()类的next()方法。

String input = in.next()

同样,如果你使用

Pattern p = Pattern.compile("[\d]{4,}+[-?]{1,1}+[\d]{2,}+[-?]{1,1}+[\d]{3,}");

它也验证了111111-11-11111。要避免这种情况,请使用

Pattern p = Pattern.compile("[\d]{4}+[-?]{1}+[\d]{2}+[-?]{1}+[\d]{3}");

最新更新