我必须标记一个看起来像这样的字符串:
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方法是什么?
答案 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()
。
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;
}