所以我的问题是我必须从字符串中删除空格,但只能在字符串的某些位置删除。我有一个逐行读取.txt文件的程序,文件中的行可以是以下类型:
|sometext:anothertext|
|some text : anothertext|
|some text:another text |
| sometext : anothertext |
'|'标记线的开始和结束。
现在我只需删除该行前后的空格,并在':'旁边删除。
编辑:似乎正则表达式是最简单的方法
答案 0 :(得分:0)
我有一个实用程序类,它有一堆用于处理字符串的静态方法;我将只显示修剪空格的相关函数,以及分割字符串或使用分隔子字符串或字符标记字符串的方法。
<强> Utility.h 强>
#ifndef UTILITY_H
#define UTILITY_H
class Utility {
public:
static std::string trim( const std::string& str, const std::string elementsToTrim = " \t\n\r" );
static std::vector<std::string> splitString( const std::string& strStringToSplit, const std::string& strDelimiter, const bool keepEmpty = true );
private:
Utility(); // Private - Not A Class Object
Utility( const Utility& c ); // Not Implemented
Utility& operator=( const Utility& c ); // Not Implemented
}; // Utility
#endif // UTILITY_H
<强> Utility.cpp 强>
#include "stdafx.h"
#include "Utility.h"
// ----------------------------------------------------------------------------
// trim()
// Removes Elements To Trim From Left And Right Side Of The str
std::string Utility::trim(const std::string& str, const std::string elementsToTrim) {
std::basic_string<char>::size_type firstIndex = str.find_first_not_of(elementsToTrim);
if (firstIndex == std::string::npos) {
return std::string(); // Nothing Left
}
std::basic_string<char>::size_type lastIndex = str.find_last_not_of(elementsToTrim);
return str.substr(firstIndex, lastIndex - firstIndex + 1);
} // trim
// ----------------------------------------------------------------------------
// splitString()
std::vector<std::string> Utility::splitString( const std::string& strStringToSplit, const std::string& strDelimiter, const bool keepEmpty ) {
std::vector<std::string> vResult;
if ( strDelimiter.empty() ) {
vResult.push_back( strStringToSplit );
return vResult;
}
std::string::const_iterator itSubStrStart = strStringToSplit.begin(), itSubStrEnd;
while ( true ) {
itSubStrEnd = search( itSubStrStart, strStringToSplit.end(), strDelimiter.begin(), strDelimiter.end() );
std::string strTemp( itSubStrStart, itSubStrEnd );
if ( keepEmpty || !strTemp.empty() ) {
vResult.push_back( strTemp );
}
if ( itSubStrEnd == strStringToSplit.end() ) {
break;
}
itSubStrStart = itSubStrEnd + strDelimiter.size();
}
return vResult;
} // splitString
这些方法可以帮助您并使用它们只需包含标题,并在需要时使用范围解析运算符,因为这些方法是静态的,您无法实例化或定义“实用程序对象”。
#include "stdafx.h"
#include "Utility.h"
int main() {
std::string myString( "TwoWords" );
std::string delimiter( "Two" );
std::vector<std::string> words;
words = Utility::splitString( myString, delimiter );
// Or
words = Utility::splitString( myString, std::string( " " ) );
// Or
words = Utility:splitString( myString, " " );
std::string sentence( " Hello World! " );
sentence = Utility::trim( sentence ); // 2nd Parameter Default To Whitespace
return 0;
}
现在您可以修改这些方法以满足您的需求,但这是我用于可重用字符串操作库的一般想法。