我有点卡在我正在研究的这个程序的第 3 部分。以下是要求:
程序将提示用户输入有效的姓氏,并重新提示直到输入有效的姓氏。如果姓氏仅包含字母和空格,以字母开头和结尾,并且不包含 2 个连续的空格,则姓氏是有效的。
然后程序会提示出生年份。有效的出生年份是 1900 和 1999 之间的整数,包括 1900 和 1999,但您的程序必须重新提示非数字输入。隐含地,这意味着您必须将数据作为字符串读取。
最后,程序会提示输入有效的威斯康星州驾照号码。它将具有 LDDD-DDDD-DDDD-DD 格式,其中 L 是大写字母,每个 D 是一个数字。例如,A123-4567-8901-23。程序会重新提示,直到输入一个有效的数字,包括破折号。
为了使这些输入保持一致,姓氏的第一个字母必须与驾驶执照号码的第一个字母相匹配。忽略大小写,因此“el Guapo”的姓氏将匹配以“E”开头的驾驶执照号码。此外,出生年份的最后 2 位数字编码在驾驶执照号码中(用 Y 表示):LDDD-DDDY-YDDD-DD。所以 A123-4567-8901-23 属于 1978 年出生的人。如果姓氏、出生年份和驾照号码一致,则程序打印一致;否则,它打印欺诈。
这是我到目前为止所拥有的:
import java.util.Scanner;
public class Program06
{
public static void main(String[] args)
{
Scanner stdIn = new Scanner(System.in);
boolean legal = false;
boolean space = false;
String name;
String yearStr = null;
String licenseNumber;
int yearInt;
// while legal is false, loop
while (!legal)
{
System.out.print("Enter a last name: ");
name = stdIn.nextLine();
legal = true; // legal will be true, until illegal input found
if (Character.isLetter(name.charAt(0))
&& Character.isLetter(name.charAt(name.length() - 1)))
{
// if first and last characters are letters, check rest, else is
// illegal
for (int i = 0; i < name.length() && legal; i++)
{
// walking through name, checking each letter.
// if legal = false, will break loop
if (Character.isLetter(name.charAt(i)))
{
space = false; // resetting space
}
else if (name.charAt(i) == ' ')
{
// making sure not 2 spaces in a row
if (!space)
{
space = true;
}
else
{
legal = false;
}
}
else
{
legal = false;
}
}
else
{
legal = false;
}
}
legal = false;
while (!legal)
{
System.out.println("Enter year of birth: ");
yearStr = stdIn.nextLine();
if (yearStr.matches("19[\\d][\\d]"))
{
legal = true;
}
}
legal = false;
while (!legal)
{
System.out.println("Enter driver's license number: ");
licenseNumber = stdIn.nextLine();
// Here
if (licenseNumber.matches("\\p{Lu}"))
{
legal = true;
}
}
}
}
在底部的第三个 while 循环(标记为// Here
)中,您可以看到我\\p{Lu}
在
if (licenseNumber.matches("\\p{Lu}")){
语句中使用了。这显然只测试大写字母,而不是“驾驶执照号码”其余部分的有效性。什么条件可以工作?