我有点卡在我正在研究的这个项目的第3部分。以下是要求:
程序将提示用户输入有效的姓氏,然后重新输入,直到输入有效的姓氏。姓氏有效,如果它只包含字母和空格,它以字母开头和结尾,并且不包含2个连续的空格。
该程序然后提示出生一年。有效出生年份是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}")){
声明。这显然只是测试大写字母,而不是其他“驾驶执照号码”的有效性。什么条件会起作用?
答案 0 :(得分:0)
实际上所有验证都可以使用String.matches()
来完成,input.matches("^(?!.* )(?i)[a-z]([a-z ]*[a-z])?")
使用正则表达式断言输入具有某种格式。
验证姓氏:
(?i
这允许单个字母的边缘情况作为姓氏,从技术上满足要求。使用负前瞻来检查没有两个相邻的空格。 input.matches("19\\d\\d")
)使正则表达式不区分大小写,以案例为例。
验证出生年份:
input.matches("[A-Z]\\d(\\d\\d-\\d\\d){3}")
相当简单。
验证驾驶执照格式:
license.charAt(0) == lastName.toUpperCase().charAt(0) &&
license.charAt(8) == yearOfBirth.charAt(2) &&
license.charAt(10) == yearOfBirth.charAt(3);
我注意到模式是“字母”,“数字”,然后是3组“数字数字短划线数字”,所以我就这样编码了。
验证驾驶执照内容:
{{1}}