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的解决方案。