// 记录当前被检视的字符串的长度,它的值恒等于(curSearchEnd - curSearchOffset)
int curSearchLength;
// 当前检视的字符串的判断结果
Hit curSearch = null;
// 限制要判断的字符串的最大开始位置
// 这个变量不随着程序的运行而变化
final int offsetLimit;
if (point != -1)
offsetLimit = point;
else
offsetLimit = limit;
// 记录到当前为止所分出的词典词语的最大结束位置
int maxDicWordEnd = offset;
// 记录最近的不在词典中的字符串(称为孤立字符串)在beef的位置,-1表示没有这个位置
int isolatedOffset = -1;
// 记录到当前为止经由词典所切出词的最大长度。
// 用于辅助判断是否调用shouldBeWord()方法,以把前后有如引号、书名号之类的,但还没有被切出的字符串当成一个词
// 详见本方法后面对maxDicWordLength的应用以及shouldBeWord()的实现
int maxDicWordLength = 0;
// 第1个循环定位被检视字符串的开始位置
// 被检视的字符串开始位置的极限是offsetLimit,而非limit
for (; curSearchOffset < offsetLimit; curSearchOffset++) {
// 第二个循环定位被检视字符串的结束位置(不包含该位置的字符)
// 它的起始状态是:被检视的字符串一长度为1,即结束位置为开始位置+1
curSearchEnd = curSearchOffset + 1;
curSearchLength = 1;
for (; curSearchEnd <= limit; curSearchEnd++, curSearchLength++) {
/*
* Fix issue 50: 中文数字解析问题
*/
//先搜索连续的中文数字
curSearch = searchNumber(beef, curSearchOffset, curSearchLength);
if (curSearch.isHit()) {
if (isolatedOffset >= 0) {
dissectIsolated(collector, beef, isolatedOffset,
curSearchOffset);
isolatedOffset = -1;
}
// trick: 用index返回中文数字实际结束位置
int numberSearchEnd = curSearch.getIndex();
int numberSearchLength = curSearch.getIndex() - curSearchOffset;
// 1.2)
// 更新最大结束位置
if (maxDicWordEnd < numberSearchEnd) {
maxDicWordEnd = numberSearchEnd;
}
// 1.3)
// 更新词语最大长度变量的值
if (curSearchOffset == offset
&& maxDicWordLength < numberSearchLength) {
maxDicWordLength = numberSearchLength;
}
Word word = curSearch.getWord();
if (!word.isNoise()) {
dissectIsolated(collector, beef, curSearchOffset,
curSearch.getIndex());
}
curSearchOffset = numberSearchEnd - 1;
break;
}
if (curSearch.isUnclosed()) {
continue;
}
// 通过词汇表判断,返回判断结果curSearch
curSearch = vocabulary.search(beef, curSearchOffset,
curSearchLength);
// ---------------分析返回的判断结果--------------------------
// 1)
// 从词汇表中找到了该词语...
if (curSearch.isHit()) {
// 1.1)
// 确认孤立字符串的结束位置=curSearchOffset,
// 并调用子方法分解把从isolatedOffset开始的到curSearchOffset之间的孤立字符串
// 孤立字符串分解完毕,将孤立字符串开始位置isolatedOffset清空
if (isolatedOffset >= 0) {
dissectIsolated(collector, beef, isolatedOffset,
curSearchOffset);
isolatedOffset = -1;
}
// 1.2)
// 更新最大结束位置
if (maxDicWordEnd < curSearchEnd) {
maxDicWordEnd = curSearchEnd;
}
// 1.3)
// 更新词语最大长度变量的值
if (curSearchOffset == offset
&& maxDicWordLength < curSearchLength) {
maxDicWordLength = curSearchLength;
}
// 1.2)
// 通知collector本次找到的词语
Word word = curSearch.getWord();
if (!word.isNoise()) {
collector.collect(word.getText(), curSearchOffset,
curSearchEnd);
}
}
// 若isolatedFound==true,表示词典没有该词语
boolean isolatedFound = curSearch.isUndefined();
// 若isolatedFound==false,则通过Hit的next属性检视词典没有beef的从offset到curWordEnd
// + 1位置的词
// 这个判断完全是为了减少一次词典检索而设计的,
// 如果去掉这个if判断,并不影响程序的正确性(但是会多一次词典检索)
if (!isolatedFound && !curSearch.isHit()
&& curSearch.getNext() != null) {
isolatedFound = curSearchEnd >= limit
|| beef.charAt(curSearchEnd) < curSearch.getNext()
.charAt(curSearchLength);
}
// 2)
// 词汇表中没有该词语,且没有以该词语开头的词汇...
// -->将它记录为孤立词语