在CString中查找以空格分隔的单词的最佳方法

时间:2009-07-24 12:13:18

标签: c++ mfc

示例:“select * from somewhere where x = 1

我想找到以空格分隔的“where”,而不是“where”中的“somewhere”。在示例“where”由空格分隔,但它可以是回车,制表符等。

注意:我知道正则表达式会让它变得容易(正则表达式相当于“\bwhere\b”),但我不想为我的项目添加一个正则表达式库来执行此操作。

5 个答案:

答案 0 :(得分:7)

如果你想使用字符串操作的纯MFC方法,那么这应该有效:

CString strSql = _T("select * from somewhere where x = 1");

int nTokenPos = 0;
CString strToken = strSql.Tokenize(_T(" \r\n\t"), nTokenPos);

while (!strToken.IsEmpty())
{
    if (strToken.Trim().CompareNoCase(_T("where")) == 0)
        return TRUE; // found
    strToken = strSql.Tokenize(_T(" \r\n\t"), nTokenPos);
}

return FALSE; // not found

答案 1 :(得分:3)

我不知道关于MFC和CString的第一件事,但在普通的C ++中,我将该字符串填充到std::istringstream并从中读取为字符串:

std::istringstream iss("select * from somewhere where x = 1");
std::string word;
do {
  iss >> word;
  if( !iss ) throw "blah blah!";
} while( word != "where" );

我认为CString确实有流运算符重载了相应的语义,但正如我所说,我不知道。

答案 2 :(得分:2)

非常快,不需要构建繁重的istringstream个对象。

CString str = L"select * from somewhere where x = 1";
CString to_find = L"where";
int i =0;
while ( i < str.GetLength() ) {
    i = str.Find(to_find, i);
    if ( i == -1 ) break;
    if ( (i == 0 || !isalpha(str[i-1])) && (i == str.GetLength()-to_find.GetLength() || !isalpha(str[i+to_find.GetLength()])) ) break;
    i+=to_find.GetLength();
}
if ( i >= 0 && i < str.GetLength() ) // found
else // not found

答案 3 :(得分:0)

如果您使用Visual Studio 2008 with Feature Pack,那么您已经在C ++中拥有std::tr1::regex

答案 4 :(得分:-1)

好吧,正则表达式是正确的答案。如果你不想包含正则表达式,你将不得不尝试自己实现一些正则表达式并搜索“where”。

我猜你唯一的其他选择就是搜索“where”,然后检查匹配前后的字符,看看它们是否是空白字符。