📄 liblexic.cpp
字号:
bFitted = true;
if('%' == strWord[len-1]) {
strTemp.erase(strTemp.begin(),strTemp.end());
strTemp.append(strWord,0,len-1);
if(PatternNumeral(strTemp,strTempPatEx))
{
strTempPat = strTempPat + strTempPatEx;
strTempPat = strTempPat + "%";
}
else {
bFitted = false;
}
if(bFitted) {
strPattern = strPattern + strTempPat;
}
return bFitted;
} // {d}%
for(i=0; i<len && bFitted; i++)
{
if(strWord[i]==':') {
if(PatternNumeral(strTemp,strTempPatEx))
{
strTempPat = strTempPat + strTempPatEx;
}
else {
bFitted = false;
}
strTemp.erase(strTemp.begin(),strTemp.end());
strTempPat = strTempPat + ":";
}
else {
strTemp.append(1,strWord[i]);
}
} // for
if(bFitted) {
if(PatternNumeral(strTemp,strTempPatEx))
{
strTempPat = strTempPat + strTempPatEx;
}
else {
bFitted = false;
}
}
if(bFitted) {
strPattern = strPattern + strTempPat;
}
return bFitted;
}
// {i} + 全字母
// {f} + 全字母
// {d} + 全字母
//
// {i} + 全字母 + . 12.6ft.
// {f} + 全字母 + .
// {d} + 全字母 + .
// {i} + 全字母 + {i} 680x0-based 80486DX2-based 80486DX2-50
// {i} + 单字符 + . + 单字符 + .......(省略)
// {f} + 单字符 + . + 单字符 + .......(省略) 9.30p.m
// {d} + 单字符 + . + 单字符 + .......(省略)
// 说明:若只加 点号 就结束了 若加 . + 单字符 还可以递归
bool CLibLexic::PatternDA(string strWord,string& strPattern)
{
string strNumPat,strNum,strTemp;
int i,state,len;
bool bAtEndState,bNormalQuit;
len = strWord.length();
for(i=0, state=0, bAtEndState=false, bNormalQuit=true;
i<len && bNormalQuit;
i++)
{
switch(state) {
case 0:
if (strWord[i]>='0' && strWord[i]<='9') {
state = 2;
bAtEndState = false;
strNum.append(1,strWord[i]);
}
else if ('.'==strWord[i]) {
state = 1;
bAtEndState = false;
strNum.append(1,strWord[i]);
}
else {
bNormalQuit = false;
}
break;
case 1:
if (strWord[i]>='0' && strWord[i]<='9') {
state = 2;
bAtEndState = false;
strNum.append(1,strWord[i]);
}
else {
bNormalQuit = false;
}
break;
case 2:
if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z'))
{
state = 3;
bAtEndState = true;
strTemp.append(1,strWord[i]);
}
else if (strWord[i]>='0' && strWord[i]<='9') {
state = 2;
bAtEndState = false;
strNum.append(1,strWord[i]);
}
else if ('.'==strWord[i]) {
state = 1;
bAtEndState = false;
strNum.append(1,strWord[i]);
}
else if (','==strWord[i]) {
state = 1;
bAtEndState = false;
strNum.append(1,strWord[i]);
}
else {
bNormalQuit = false;
}
break;
case 3:
if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z'))
{
state = 4;
bAtEndState = true;
strTemp.append(1,strWord[i]);
}
else if ('.'==strWord[i]) {
state = 6;
bAtEndState = false;
strTemp.append(1,strWord[i]);
}
else {
bNormalQuit = false;
}
break;
case 4:
if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z'))
{
state = 4;
bAtEndState = true;
strTemp.append(1,strWord[i]);
}
else if ('.'==strWord[i]) {
state = 5;
bAtEndState = true;
strTemp.append(1,strWord[i]);
}
else {
bNormalQuit = false;
}
break;
case 5:
bNormalQuit = false;
break;
case 6:
if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z'))
{
state = 7;
bAtEndState = true;
strTemp.append(1,strWord[i]);
}
else {
bNormalQuit = false;
}
break;
case 7:
if ('.'==strWord[i]) {
state = 8;
bAtEndState = true;
strTemp.append(1,strWord[i]);
}
else {
bNormalQuit = false;
}
break;
case 8:
if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z'))
{
state = 7;
bAtEndState = true;
strTemp.append(1,strWord[i]);
}
else {
bNormalQuit = false;
}
break;
default:
assert(false);
} // switch;
} // for
if(bNormalQuit&&bAtEndState) {
if(PatternNumeral(strNum,strNumPat)){
strPattern = strNumPat + strTemp;
return true;
}
}
len = strWord.length();
strTemp.erase(strTemp.begin(),strTemp.end());
for(i=0, state=0, bAtEndState=false, bNormalQuit=true;
i<len && bNormalQuit;
i++)
{
switch(state) {
case 0:
if (strWord[i]>='0' && strWord[i]<='9') {
state = 1;
bAtEndState = false;
}
else {
bNormalQuit = false;
}
break;
case 1:
if (strWord[i]>='0' && strWord[i]<='9') {
state = 1;
bAtEndState = false;
}
else if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z'))
{
strTemp.append(1,strWord[i]);
state = 2;
bAtEndState = false;
}
else {
bNormalQuit = false;
}
break;
case 2:
if (strWord[i]>='0' && strWord[i]<='9') {
state = 3;
bAtEndState = true;
}
else if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z'))
{
strTemp.append(1,strWord[i]);
state = 2;
bAtEndState = false;
}
else {
bNormalQuit = false;
}
break;
case 3:
if (strWord[i]>='0' && strWord[i]<='9') {
state = 3;
bAtEndState = true;
}
else {
bNormalQuit = false;
}
break;
default:
assert(false);
}
}
if(bNormalQuit&&bAtEndState) {
strPattern = "{i}" + strTemp + "{i}";
return true;
}
return false;
}
// ' + {i}
// ' + {i} + s
// {i} + ' + s
// 如 '90s 2005's 1980's 60's 16's '90
bool CLibLexic::PatternIS(string strWord,string& strPattern)
{
string strTempPat;
bool bNormalQuit,bAtEndState;
int i,state,len;
len = strWord.length();
bNormalQuit = true;
bAtEndState = false;
for(i=0 , state=0; i<len && bNormalQuit; i++)
{
switch(state) {
case 0:
if (strWord[i]>='0' && strWord[i]<='9')
{
bAtEndState = false;
state = 3;
}
else if (strWord[i]=='\'') {
strTempPat = "'";
bAtEndState = false;
state = 1;
}
else {
bNormalQuit = false;
}
break;
case 1:
if (strWord[i]>='0' && strWord[i]<='9')
{
bAtEndState = true;
state = 2;
}
else {
bNormalQuit = false;
}
break;
case 2:
if (strWord[i]>='0' && strWord[i]<='9')
{
bAtEndState = true;
state = 2;
}
else if (strWord[i]=='s')
{
strTempPat = strTempPat + "{i}s";
bAtEndState = true;
state = 5;
}
else {
bNormalQuit = false;
}
break;
case 3:
if (strWord[i]>='0' && strWord[i]<='9')
{
bAtEndState = false;
state = 3;
}
else if (strWord[i]=='\'') {
strTempPat = "{i}'";
bAtEndState = false;
state = 4;
}
else {
bNormalQuit = false;
}
break;
case 4:
if (strWord[i]=='s')
{
strTempPat = strTempPat + "s";
bAtEndState = true;
state = 5;
}
else {
bNormalQuit = false;
}
break;
case 5:
bNormalQuit = false;
break;
default:
assert(false);
} // switch
} // for
if(bNormalQuit&&bAtEndState) {
if(2==state){
strTempPat = strTempPat + "{i}";
}
strPattern = strTempPat;
return true;
}
return false;
}
// 任意字符 + (s) s不分大小写
// 任意字符 + (es) es不分大小写
// (全小写字母)在单词的前,中,后
bool CLibLexic::PatternLSR(string strWord, string& strPattern)
{
string strTemp;
int i,len,state;
bool bNormalQuit,bAtEndState,bFitted;
len = strWord.length();
bNormalQuit = true;
bAtEndState = false;
for(i=0,state=0; i<len && bNormalQuit; i++)
{
switch(state) {
case 0:
if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z'))
{
state = 0;
bAtEndState = false;
strTemp.append(1,strWord[i]);
}
else if ('('==strWord[i]) {
state = 1;
bAtEndState = false;
//strTemp.append(1,strWord[i]);
}
else {
bNormalQuit = false;
}
break;
case 1:
if ( strWord[i]>='a' && strWord[i]<='z')
{
state = 2;
bAtEndState = false;
strTemp.append(1,strWord[i]);
}
else {
bNormalQuit = false;
}
break;
case 2:
if ( strWord[i]>='a' && strWord[i]<='z')
{
state = 2;
bAtEndState = false;
strTemp.append(1,strWord[i]);
}
else if (')'==strWord[i]) {
state = 3;
bAtEndState = true;
//strTemp.append(1,strWord[i]);
}
else {
bNormalQuit = false;
}
break;
case 3:
if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z'))
{
state = 4;
bAtEndState = true;
strTemp.append(1,strWord[i]);
}
else {
bNormalQuit = false;
}
break;
case 4:
if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z'))
{
state = 4;
bAtEndState = true;
strTemp.append(1,strWord[i]);
}
else if ('('==strWord[i]) {
state = 1;
bAtEndState = false;
//strTemp.append(1,strWord[i]);
}
else {
bNormalQuit = false;
}
break;
default:
assert(false);
}
}
bFitted = (bNormalQuit&&bAtEndState);
if(!bFitted) {
bNormalQuit = true;
if(len < 4) {
bNormalQuit = false;
}
if(bNormalQuit) {
strTemp.erase(strTemp.begin(),strTemp.end());
strTemp.append(strWord,len-3,3);
ToLower(strTemp);
if(strTemp.compare("(s)")==0) {
//strTemp = strWord;
strTemp.erase(strTemp.begin(),strTemp.end());
strTemp.append(strWord,0,len-3);
strTemp = strTemp + "s";
}
else {
bNormalQuit = false;
}
}
bFitted = bNormalQuit;
}
if(!bFitted) {
bNormalQuit = true;
if(len < 5) {
bNormalQuit = false;
}
if(bNormalQuit) {
strTemp.erase(strTemp.begin(),strTemp.end());
strTemp.append(strWord,len-4,4);
ToLower(strTemp);
if(strTemp.compare("(es)")==0) {
//strTemp = strWord;
strTemp.erase(strTemp.begin(),strTemp.end());
strTemp.append(strWord,0,len-4);
strTemp = strTemp + "es";
}
else {
bNormalQuit = false;
}
}
bFitted = bNormalQuit;
}
if(bFitted)
strPattern = strTemp;
return bFitted;
}
void CLibLexic::ToLower(string &str)
{
string strTemp;
strTemp = str;
str.erase(str.begin(),str.end());
for(int i=0; i<strTemp.length(); i++)
{
if( strTemp[i]>='A' && strTemp[i]<='Z') {
str.append(1,strTemp[i]-'A'+'a');
}
else {
str.append(1,strTemp[i]);
}
} //将大写字母变为小写字母
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -