String语句使用if语句

时间:2013-05-20 00:20:22

标签: java stringtokenizer

我必须标记一个看起来像这样的字符串:
4830673048;Tony White
必须有两个令牌以;分隔 第一个标记必须包含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 个答案:

答案 0 :(得分:2)

只需将String.matches()与正确的正则表达式一起使用,您只需要一行:

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

除非在多处使用,否则我会废弃该方法并在线使用该代码段。

答案 1 :(得分: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并尝试即可。第二个令牌不需要正则表达式匹配,因此不需要执行任何操作。

我做了一些研究,发现了{strong> Mkyong this solid example,我很欣赏这些教程。他在教程中写道:

while (st.hasMoreElements()) {
    System.out.println(st.nextElement());
}

而不是直接使用nextToken()

Oracle

This tutorial提供了更加体面和全面的解释。在那里,nextToken()被深深地解释和实例化。

正如您在两个示例中所看到的,nextToken()nextElement()函数都从标记生成器中获取下一个标记。因此,您需要将其中一个函数的第一次调用分配给变量并对其进行控制。如:

String firstToken = st.nextToken().toString();
if(firstToken .length() == 10 && firstToken .matches(".*[0-9].*")) {
    ...
}

请勿忘记在toString()之后使用nextToken()

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

答案 3 :(得分: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;
  }