我试图完成这个代码的最后一部分,但似乎无法得到最后2 if语句是有效的,当他们应该。当没有字母数字或破折号第二个应显示( - )。第三要确保2个破折号是不连续的,而不是在开始或结束。该表达式必须是错的,但我对如何解决这些问题还是新的正则表达式不知道。感谢您的帮助提前!这里是我到目前为止...
import java.util.Scanner;
public class VerifySerialBHarris {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
String text;
String cha;
System.out.println("Enter a Serial number: ");
text=input.nextLine();
if(text.matches("[A-Za-z0-9]+(-[A-Za-z0-9]+){2}")){
System.out.println("Serial number "+text+" verification \nValid");
System.out.println("Enter a wildchar character: ");
cha=input.nextLine();
text= text.replaceAll("[A-Za-z0-9]", cha);
System.out.println("Masked serial: "+text);
}
if(text.matches(".[^-A-Za-z0-9].")) {
System.out.println("Invalid. Serial should only contain letters, numbers, and dashes(-)");
}
if(text.matches("[^A-Za-z0-9]+(-[A-Za-z0-9]+)"))
System.out.println("Invalid. There should be exactly 2 non-consecutive dashes in the middle. ");
}
}
你已经有充分的模式[A-Za-z0-9]+(-[A-Za-z0-9]+){2}
,它可能更容易列出模式,并给出错误信息,说明输入的数据不符合要求的模式。
如果你想通过分析那种作出错误的给予反馈给用户,那么你必须为所有样的错误,用户可以创建一个模式。对于代码,我建议利用例如一个if else if
结构,使你没有得到错误信息,而模式是正确的。
关于第二个和第三个模式
当没有字母数字或破折号第二个应显示( - )。
第二图案.[^-A-Za-z0-9].
将匹配3个字符,其中第一和最后一个可以是除由于点换行符任何字符,并且还可以匹配一个字母或数字。
为了配合无字母数字或破折号,你可以使用:
.*[^-A-Za-z0-9].*
第三要确保2个破折号是不连续的,而不是在开始或结束
第三个模式[^A-Za-z0-9]+(-[A-Za-z0-9]+)
首先匹配使用[^
也可以搭配一个连字符,因为它不是上市究竟是不是因否定字符类,但没有到。
为了匹配这个模式,你可以重复连字符1+时间:
[A-Za-z0-9]+(-+[A-Za-z0-9]+){2,}
你的第一个正则表达式,[A-Za-z0-9]+(-[A-Za-z0-9]+){2}
,已经只匹配包含正好用两个非连续的破折号间括3个块码。
当您使用的是第二正则表达式,它主要的问题,因为你有你的状态倒。它更容易询问是否匹配失败[-A-Za-z0-9]+
比它确实符合一些其他的模式,只有适合与无效字符序列 - 一个令人困惑的双重否定。
对于第三个条件,你也许并不需要在所有检查什么。你已经消灭了所有其他的失败案例(无效字符和不正确的布局),因此你可以描述你需要通过一个单一的破折号分开3个字母块。
而作为它已经提到其他地方,你应该用if ... else if ... else ...
等。