免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
如何輕松編寫一個強大的字符串分解器(2)
如果bReturnTokens=true,把子串中的分隔符數(shù)量乘以2,再從實際總數(shù)量減去該數(shù)字,就得到了標記的總數(shù)。理由是,對于子串buy, a, book,StringTokenizer將返回5個標記(即buy:,:a:,:book),而PowerfulTokenizer將返回一個標記(即buy, a, book),兩者的差值是4(即,2乘以子串中的分隔符數(shù)量)。這個公式對于所有包含分隔符的子串都有效。

 

類似地,對于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;
}
}

nextToken()方法通過StringTokenizer.nextToken方法獲取標記,并檢查標記中的雙引號字符。如果發(fā)現(xiàn)了這些字符,它繼續(xù)獲取標記直至不能再找到帶有雙引號的標記。另外,它還把標記保存到一個變量(sPrevToken,參見本文后面完整的源代碼)以檢查連續(xù)出現(xiàn)的分隔符。如果nextToken()發(fā)現(xiàn)等同于分隔符的連續(xù)多個標記,那么它返回""(長度為0的字符串)作為標記。

 

按照類似的方法,hasMoreTokens()方法檢查已經(jīng)返回的標記數(shù)量是否小于標記的總數(shù)量。

【結束語】本文為你介紹了如何輕松地編寫一個強大的字符串分解器。根據(jù)本文介紹的原理,你能夠迅速編寫出復雜的字符串分解器,節(jié)省大量的開發(fā)時間。

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
改進java字符串分解的方法
06 字符串 子串
分割字符串(CString版本)(轉)
perl內(nèi)置特殊變量
1.?字符串操作函數(shù)
VC中字符串取子串總結
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服