Java-Exception Handling-Regex-Matches方法不适用于扫描仪输入
下面的代码我尝试只接受数字(0-9)和“-”作为输入来设置我的帐号 如果用户输入无效的输入,程序应该抛出一个异常,如果它是有效的输入,程序应该继续进行第二层条件处理(Java-Exception Handling-Regex-Matches方法不适用于扫描仪输入,java,regex,exception,Java,Regex,Exception,下面的代码我尝试只接受数字(0-9)和“-”作为输入来设置我的帐号 如果用户输入无效的输入,程序应该抛出一个异常,如果它是有效的输入,程序应该继续进行第二层条件处理(isCheckDigitCorrect()是另一个带有算法的方法,此时该方法不相关)如果第二个条件也是真的,我的程序应该继续设置帐号,否则会抛出异常 问题是,我的if语句总是返回false。 我试着调试我的正则表达式模式是否正确,我发现如果我声明一个字符串,即“123-123456”,它与返回true的模式匹配 但是,如果我输入与声
isCheckDigitCorrect()
是另一个带有算法的方法,此时该方法不相关)如果第二个条件也是真的,我的程序应该继续设置帐号,否则会抛出异常
问题是,我的if语句总是返回false。我试着调试我的正则表达式模式是否正确,我发现如果我声明一个字符串,即
“123-123456”
,它与返回true的模式匹配
但是,如果我输入与声明的正则表达式模式相同的输入,即input accountNumber=“123-123456”
我的测试变量返回false。这里会出现什么问题?我怎样才能解决这个问题 提前谢谢。(用于描述我的调试的图像)
我猜无论您的
键盘.nextLine()
做什么,它可能不仅返回123-123456
(以您为例),还返回字符串末尾或开头的其他空白字符。由于正则表达式^[0-9-]+$
不允许任何空格字符,因此matches()
方法在这些情况下返回false
同样,您还应该确保代码中的字符
-
与您从键盘中获得的字符真正匹配。请参阅。我想无论您的键盘.nextLine()执行什么操作,它可能不仅返回123-123456
(以您为例),而且还返回字符串末尾或开头的其他空白字符。由于正则表达式^[0-9-]+$
不允许任何空格字符,因此matches()
方法在这些情况下返回false
同样,您还应该确保代码中的字符-
与您从键盘中获得的字符真正匹配。请参阅。为什么将方法参数重新分配为第一个操作?为什么不仅仅是String accountNumber=keyboard.nextLine()
?除了您遇到的任何Java问题之外,您的正则表达式将为1-2-3-4-5
、just-
、-34534
、24534534-
、-2334-
等内容提供积极的匹配。。您可能希望将正则表达式切换为^[0-9]+(?:-[0-9]+)?$
您好,欢迎使用SO!问问题时,记得要按照要求去做。例如,您没有编写如何启动键盘
变量,这可能是问题的关键点之一。您还应删除代码中所有不相关的代码和描述。好的格式也会创造奇迹……为什么要将方法参数重新分配为第一个操作?为什么不仅仅是String accountNumber=keyboard.nextLine()
?除了您遇到的任何Java问题之外,您的正则表达式将为1-2-3-4-5
、just-
、-34534
、24534534-
、-2334-
等内容提供积极的匹配。。您可能希望将正则表达式切换为^[0-9]+(?:-[0-9]+)?$
您好,欢迎使用SO!问问题时,记得要按照要求去做。例如,您没有编写如何启动键盘
变量,这可能是问题的关键点之一。您还应删除代码中所有不相关的代码和描述。一个好的格式也能创造奇迹……我也认为会是这样,一位朋友建议使用trim()方法来消除空白,即accountNumber.trim().matches(“^[0-9-]+$”;但这仍然没有解决问题。好吧,那么也许-
并不总是-
?看见无论如何,我建议您真正地调试代码(在断点上停止它并调查变量的内容)。你一定会找到罪魁祸首的……我也认为会是这样,一位朋友建议使用trim()方法去除空白,即accountNumber.trim().matches(“^[0-9-]+$”;但这仍然没有解决问题。好吧,那么也许-
并不总是-
?看见无论如何,我建议您真正地调试代码(在断点上停止它并调查变量的内容)。那你一定要找到罪犯。。。
private void setAccountNumber(String accountNumber) {
accountNumber = keyboard.nextLine();
String regex = "123-123456";
boolean test = regex.matches("^[0-9-]+$");
if(accountNumber.matches("^[0-9-]+$")) {
if(isCheckDigitCorrect(accountNumber)) { this.accountNumber = accountNumber;
} else { throw new
BadAccountInputException(" Bad account number; check digit failed."); }
} else { throw new
BadAccountInputException("Account number must consists of numbers separated by -, other non-numeric characters not allowed"
);
}
}