類似地,對于bReturnTokens=false的情形,我們從實際總數(shù)(19)減去表達式[分隔符總數(shù)(11)- 連續(xù)分隔符數(shù)量(4) + 子串中的分隔符數(shù)量(3)]。由于這時我們不返回分隔符,它們(非連續(xù)出現(xiàn)或在子串內(nèi)部)對我們來說沒有用,上面的公式為我們返回了標記的總數(shù)量(9)。
請記住這兩個公式,它們是PowerfulTokenizer的核心。這兩個公式適用于幾乎所有它們各自條件下的情形。但是,如果你有更復雜的要求,不能使用這兩個公式,那么你應該在編寫代碼之前分析各種可能出現(xiàn)的情況,并設計出自己的公式。
// 檢查分隔符是否位于子串之內(nèi)
for (int i=1; i/td>
{
iIndex = sInput.indexOf(sDelim, iIndex+1);
if (iIndex == -1)
break;
// 如果分隔符位于子串之內(nèi),則向前分析直至子串結束
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;
}
}
countTokens()方法檢查子串是否包含雙引號。如果包含,那么它減少總數(shù)并把索引值修改為字符串中下一個雙引號出現(xiàn)的位置(如上面的代碼片斷所示)。如果bReturnTokens是false,那么它從總數(shù)減去輸入字符串中出現(xiàn)的非連續(xù)分隔符的數(shù)量。
// 如發(fā)現(xiàn)多個連續(xù)的分隔符,則返回""作為標記
if ( (sPrevToken.equals(sDelim)) && (sToken.equals(sDelim)) ) {
sPrevToken = sToken;
iTokenNo++;
return "";
}
// 檢查標記本身是否等于分隔符
if ( (sToken.trim().startsWith("\"")) && (sToken.length() == 1) ) {
// 標記本身等于分隔符的特殊情況
String sNextToken = oTokenizer.nextToken();
while (!sNextToken.trim().endsWith("\"")) {
sToken += sNextToken;
sNextToken = oTokenizer.nextToken();
}
sToken += sNextToken;
sPrevToken = sToken;
iTokenNo++;
return sToken.substring(1, sToken.length()-1);
}
// 檢查字符串中是否包含子串
else if ( (sToken.trim().startsWith("\""))
&& (!((sToken.trim().endsWith("\""))
&& (!sToken.trim().endsWith("\"\"")))) )
{
if (oTokenizer.hasMoreTokens())
{
String sNextToken = oTokenizer.nextToken();
// 檢查"\"\""
while (!((sNextToken.trim().endsWith("\""))
&& (!sNextToken.trim().endsWith("\"\""))) )
{
sToken += sNextToken;
if (!oTokenizer.hasMoreTokens())
{
sNextToken = "";
break;
}
sNextToken = oTokenizer.nextToken();
}
sToken += sNextToken;
}
}
按照類似的方法,hasMoreTokens()方法檢查已經(jīng)返回的標記數(shù)量是否小于標記的總數(shù)量。
【結束語】本文為你介紹了如何輕松地編寫一個強大的字符串分解器。根據(jù)本文介紹的原理,你能夠迅速編寫出復雜的字符串分解器,節(jié)省大量的開發(fā)時間。