示例:“select * from somewhere where x = 1
”
我想找到以空格分隔的“where
”,而不是“where
”中的“somewhere
”。在示例“where”由空格分隔,但它可以是回车,制表符等。
注意:我知道正则表达式会让它变得容易(正则表达式相当于“\bwhere\b
”),但我不想为我的项目添加一个正则表达式库来执行此操作。
答案 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”,然后检查匹配前后的字符,看看它们是否是空白字符。