1

次のような文字列をトークン化する
4830673048;Tony White
必要があります: で区切られた 2 つのトークンが必要です;
。最初のトークンには 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()。それで私の質問は、最初または2番目のトークンのみをチェックするための適切なStringTokenizerメソッドは何ですか?

4

4 に答える 4

2

適切な正規表現を使用String.matches()するだけで、必要なのは 1 行だけです。

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

これが複数の場所で使用されていない限り、メソッドを破棄してスニペットをインラインで使用します。

于 2013-05-20T00:43:00.313 に答える
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、最初のトークンの評価中に 2 回呼び出していたため、うっかりして 2 番目のトークンに移行するのが早すぎました。最初に変数に値を代入することで、この問題を簡単に解消できます。

于 2013-05-20T00:42:36.593 に答える
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を削除して試してみてください。2 番目のトークンの正規表現一致は必要ないため、そのためのアクションは必要ありません。

私はいくつかの調査を行い、私が尊敬するチュートリアルの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 に答える
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 に答える