1

我必须对一个看起来像这样的字符串进行标记:
4830673048;Tony White
必须有两个由 a 分隔的标记;
第一个标记必须包含 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 方法是什么?

4

4 回答 4

2

只需使用String.matches()适当的正则表达式,您只需要一行:

return accountLine.matches("\\d{10};[^\\d]+");

除非在多个地方使用它,否则我只会废弃该方法并使用内联代码段。

于 2013-05-20T00:43:00.313 回答
1
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().matches(".*[0-9].*")。只需删除内部if并尝试。您不需要对第二个令牌进行正则表达式匹配,因此无需执行任何操作。

我做了一些研究,从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].*")) {
    ...
}

不要忘记使用toString()after nextToken()

于 2013-05-20T00:25:51.980 回答
1

看看这是否适合你:

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了两次,无意中过早地转到了第二个令牌。通过首先将值分配给变量,您可以轻松消除此问题。

于 2013-05-20T00:42:36.593 回答
0
Try this:

private static boolean isValid(String accountLine) throws BankAccountException
  {
     StringTokenizer strTok = new StringTokenizer(accountLine, ";");
     boolean valid = true;
     String bankAccount = (String)strTok.nextElement();
     if(strTok.countTokens() == 2)
     {
        if(strTok.nextToken().length() == 10 && bankAccount.matches(".*[0-9].*"))
        {
            valid = true;
        }
     }
     else
     {
        System.out.println("Invalid Bank Account info. " + bankAccount);
        valid = false;
     }
     return valid;
  }
于 2013-05-20T00:30:04.243 回答