从字符串的某些点删除空格

时间:2016-12-15 11:16:06

标签: c++ string

所以我的问题是我必须从字符串中删除空格,但只能在字符串的某些位置删除。我有一个逐行读取.txt文件的程序,文件中的行可以是以下类型:

|sometext:anothertext|

|some text   :  anothertext|

|some text:another text |

| sometext    :    anothertext  |

'|'标记线的开始和结束。

现在我只需删除该行前后的空格,并在':'旁边删除。

编辑:似乎正则表达式是最简单的方法

1 个答案:

答案 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;
}

现在您可以修改这些方法以满足您的需求,但这是我用于可重用字符串操作库的一般想法。