Java if语句的StringTokenizer问题
我必须标记一个如下所示的字符串:Java if语句的StringTokenizer问题,java,stringtokenizer,Java,Stringtokenizer,我必须标记一个如下所示的字符串: 4830673048;托尼·怀特 必须有两个由分隔的标记 第一个令牌必须包含10个数字,并且只能包含数字 第二个令牌不能包含数字 private static boolean isValid(String accountLine) throws BankAccountException { StringTokenizer strTok = new StringTokenizer(accountLine, ";"); boolean v
4830673048;托尼·怀特
必须有两个由
分隔的标记代码>
第一个令牌必须包含10个数字,并且只能包含数字
第二个令牌不能包含数字
private static boolean isValid(String accountLine) throws BankAccountException
{
StringTokenizer strTok = new StringTokenizer(accountLine, ";");
boolean valid = true;
if(strTok.countTokens() == 2)
{
if(strTok.nextToken().length() == 10 && strTok.nextToken().matches(".*[0-9].*"))
{
if(!strTok.nextToken().matches(".*[0-9].*"))
{
valid = true;
}
}
}
else
{
System.out.println("Invalid Bank Account info. " + strTok.nextToken());
valid = false;
}
return valid;
}
这是我提出的代码,但它没有达到我预期的效果。我知道问题可能在于我使用了.nextToken()
。那么我的问题是,什么是只检查第一个或第二个标记的合适的StringTokenizer方法
if(strTok.nextToken().length() == 10 && strTok.nextToken().matches(".*[0-9].*"))
{
if(!strTok.nextToken().matches(".*[0-9].*"))
{
valid = true;
}
}
现在让我们看看这段代码。首先说strTok.nextToken().matches(“%0-9]”)
,然后说!strTok.nextToken()匹配(“%0-9]”)
。只要删除内部的(如果),然后再试一次。第二个令牌不需要正则表达式匹配,因此不需要执行任何操作
我做了一些研究,从Mkyong那里找到了我很欣赏他的教程。在教程中,他写道:
while (st.hasMoreElements()) {
System.out.println(st.nextElement());
}
而不是直接使用nextToken()
Oracle的提供了更为得体和全面的解释。在这方面,nextToken()
得到了深入的解释和示例
正如您将在两个示例中看到的,nextToken()
和nextElement()
函数都从标记器获取下一个标记。因此,您需要将其中一个函数的第一次调用分配给一个变量,并对该变量进行控制。例如:
String firstToken = st.nextToken().toString();
if(firstToken .length() == 10 && firstToken .matches(".*[0-9].*")) {
...
}
不要忘记在nextToken()
之后使用toString()
现在让我们看看这段代码。首先说strTok.nextToken().matches(“%0-9]”)
,然后说!strTok.nextToken()匹配(“%0-9]”)
。只要删除内部的(如果),然后再试一次。第二个令牌不需要正则表达式匹配,因此不需要执行任何操作
我做了一些研究,从Mkyong那里找到了我很欣赏他的教程。在教程中,他写道:
while (st.hasMoreElements()) {
System.out.println(st.nextElement());
}
而不是直接使用nextToken()
Oracle的提供了更为得体和全面的解释。在这方面,nextToken()
得到了深入的解释和示例
正如您将在两个示例中看到的,nextToken()
和nextElement()
函数都从标记器获取下一个标记。因此,您需要将其中一个函数的第一次调用分配给一个变量,并对该变量进行控制。例如:
String firstToken = st.nextToken().toString();
if(firstToken .length() == 10 && firstToken .matches(".*[0-9].*")) {
...
}
不要忘记在nextToken()
之后使用toString()
,看看这是否适合您:
private static boolean isValid(String accountLine) throws BankAccountException
{
StringTokenizer strTok = new StringTokenizer(accountLine, ";");
boolean valid = true;
if(strTok.countTokens() == 2)
{
String acctNum = strTok.nextToken();
String acctHolder = strTok.nextToken();
if(acctNum.length() == 10
&& acctNum.matches(".*[0-9].*")
&& !acctHolder.matches(".*[0-9].*"))
{
valid = true;
}
}
else
{
System.out.println("Invalid Bank Account info. " + strTok.nextToken());
valid = false;
}
return valid;
}
在您发布的代码中,您在计算第一个令牌时调用了两次nextToken
,无意中太快转到了第二个令牌。通过首先将值分配给变量,您可以很容易地消除此问题。查看这是否适用于您:
private static boolean isValid(String accountLine) throws BankAccountException
{
StringTokenizer strTok = new StringTokenizer(accountLine, ";");
boolean valid = true;
if(strTok.countTokens() == 2)
{
String acctNum = strTok.nextToken();
String acctHolder = strTok.nextToken();
if(acctNum.length() == 10
&& acctNum.matches(".*[0-9].*")
&& !acctHolder.matches(".*[0-9].*"))
{
valid = true;
}
}
else
{
System.out.println("Invalid Bank Account info. " + strTok.nextToken());
valid = false;
}
return valid;
}
在您发布的代码中,您在计算第一个令牌时调用了两次nextToken
,无意中太快转到了第二个令牌。通过首先将值分配给变量,您可以轻松消除此问题。只需与适当的正则表达式一起使用,您只需要一行:
return accountLine.matches("\\d{10};[^\\d]+");
除非在不止一个地方使用,否则我将放弃该方法并在线使用代码段。只需与适当的正则表达式一起使用,您只需要一行:
return accountLine.matches("\\d{10};[^\\d]+");
除非在不止一个地方使用它,否则我只会放弃该方法并在线使用代码段。这会给我“BankAccountProcessor.java:19:error:Compatible types String bankAccount=strTok.nextElement();^required:String found:Object 1 error”类型将其强制转换为String,代码以相同的分辨率更新。这将为我提供“BankAccountProcessor.java:19:错误:不兼容类型字符串bankAccount=strTok.nextElement();^required:找到字符串:对象1错误”类型将其强制转换为字符串,代码以相同的分辨率更新。为什么要标记化然后使用正则表达式?在accountLine本身上使用它。看看@Bohemian的解决方案。为什么要标记化然后使用正则表达式?在accountLine本身上使用它。看看@Bohemian的解决方案。