StringTokenizer(String sInput):以空白字符(“ ”,“\t”,“\n”)为分隔符分割字符串。
StringTokenizer(String sInput, String sDelimiter):以sDelimiter为分隔符分割字符串。
StringTokenizer(String sInput, String sDelimiter, boolean bReturnTokens):以sDelimiter为分隔符分割字符串,但如果bReturnTokens为true,则分隔符也作为标记返回。
第一个构造函数不检查输入字符串是否包含子串。例如,如果以空白字符为分隔符分割“hello. Today \"I am \" going to my home town”,则字符串分解结果是hello.、Today、"I、am、"、going等,而不是hello.、Today、"I am "、going等。
如果bReturnTokens=true,把子串中的分隔符数量乘以2,再从实际总数量减去该数字,就得到了标记的总数。理由是,对于子串“buy, a, book”,StringTokenizer将返回5个标记(即“buy:,:a:,:book”),而PowerfulTokenizer将返回一个标记(即“buy, a, book”),两者的差值是4(即,2乘以子串中的分隔符数量)。这个公式对于所有包含分隔符的子串都有效。
类似地,对于bReturnTokens=false的情形,我们从实际总数(19)减去表达式[分隔符总数(11)- 连续分隔符数量(4) + 子串中的分隔符数量(3)]。由于这时我们不返回分隔符,它们(非连续出现或在子串内部)对我们来说没有用,上面的公式为我们返回了标记的总数量(9)。
请记住这两个公式,它们是PowerfulTokenizer的核心。这两个公式适用于几乎所有它们各自条件下的情形。但是,如果你有更复杂的要求,不能使用这两个公式,那么你应该在编写代码之前分析各种可能出现的情况,并设计出自己的公式。
// 检查分隔符是否位于子串之内
for (int i=1; i<aiIndex.length; i++)>/td>
{
iIndex = sInput.indexOf(sDelim, iIndex+1);
if (iIndex == -1)
break;
// 如果分隔符位于子串之内,则向前分析直至子串结束
while (sInput.substring(iIndex-iLen, iIndex).equals(sDelim))
{
iNextIndex = sInput.indexOf(sDelim, iIndex+1);
if (iNextIndex == -1)
break;
iIndex = iNextIndex;
}
aiIndex[i] = iIndex;
//System.out.println("aiIndex[" + i + "] = " + iIndex);
if (isWithinQuotes(iIndex))
{
if (bIncludeDelim)
iTokens -= 2;
else
iTokens -= 1;
}
}