C++ 如何在C+中删除包含大量内容的字符串中的行+;?

C++ 如何在C+中删除包含大量内容的字符串中的行+;?,c++,C++,我有一个包含以下内容的字符串: string myString; cout<<"String :"<<endl<<myString<<endl; 因此,在上面的示例中,如何删除包含“newfuncon”字符串的整行 使用string::find查找字符串中的文本newFunction 再次使用string::find,但从找到newFunction的位置开始搜索下一个'\n' 对于上一个'\n' 使用string::erase删除两个换行符之间

我有一个包含以下内容的字符串:

string myString;
cout<<"String  :"<<endl<<myString<<endl;
因此,在上面的示例中,如何删除包含“newfuncon”字符串的整行

  • 使用
    string::find
    查找字符串中的文本
    newFunction
  • 再次使用
    string::find
    ,但从找到
    newFunction
    的位置开始搜索下一个
    '\n'
  • 对于上一个
    '\n'
  • 使用
    string::erase
    删除两个换行符之间的文本,只留下一个换行符
  • 例如:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main() {
        string text = "hello\nblahafei fao ef\nthis is a string\nhello newFunction stuff\nasdfefe\nnopef";
    
        size_t nFPos = text.find("newFunction");
        size_t secondNL = text.find('\n', nFPos);
        size_t firstNL = text.rfind('\n', nFPos);
    
        cout << "Original string: " << '\n' << text << '\n' << endl;
    
        text.erase(firstNL, secondNL - firstNL);
    
        cout << "Modified string: " << '\n' << text << endl;
    
        return 0;
    }
    

    这取决于您是否知道要删除第二行,您可以执行以下操作:

    auto b = std::find(myString.begin(), myString.end(), '\n');
    ++b;
    auto e = std::find(b, myString.end(), '\n');
    ++e;
    myString.erase(b,e);
    

    您可能希望将其组织到函数中,例如:

    void RemoveLine(std::string& source, const std::string& to_remove)
    {
        size_t m = source.find(to_remove);
        size_t n = source.find_first_of("\n", m + to_remove.length());
        source.erase(m, n - m + 1);
    }
    
    用法:

    RemoveLine(myString, std::string("cv_take_Case::newFunction"));
    

    请注意,我假设我们搜索的零件将位于生产线的边缘。要获得更可靠的解决方案,请查看Seth Carnegie的答案。

    现在C++11已经推出,一个更简单的答案是使用regex\u替换

    #include <regex>
    #include <string>
    #include <iostream>
    
    main() {
    std::string text = "Stuff\nBla bla SomeFunction bletch\nThings\n";
    std::regex badLine("\n.*SomeFunction.*\n");
    std::cout << std::regex_replace(text, badLine, "\n");
    } 
    
    #包括
    #包括
    #包括
    main(){
    std::string text=“Stuff\nBla bla SomeFunction bletch\n字符串\n”;
    std::regex-badLine(“\n.*SomeFunction.*\n”);
    
    STD::字符串在哪里?(即,你输入什么?)首先,你是如何得到这个字符串的?也许你可以避免读这行。你试过C++正则表达式吗?请看这个链接:@约翰,“Mystring”是字符串变量,包含大量内容,每行以换行符结尾。我必须找到子字符串“newFunction”然后删除整行。@bsalanke如果您要搜索的字符串总是在行的开头,那么jrok的答案对您来说是最好的,因为我的答案涉及到在您想要的文本后面和前面查找新行的开销,而他只需要知道前面的新行,因为它假定您正在搜索的xt位于行的开头。感谢Benjamin提供的解决方案,但即使字符串不是第二行,您也可以建议解决方案。@BSalunke:关于这一点,请参阅Seth的答案或jrok的答案。正如我所说,这取决于您的情况。如果您提供有关您的情况的更准确信息,我们可以提供更准确的答案。KerrekSB's例如,注释可能是一个解决方案,但如果没有更多信息,我们无法知道。我同意答案,但步骤3除外。为什么不使用rfind?@OrenS。是的,那会更好。谢谢,修复了。@Seth我对我的问题的上述解决方案有一些问题。当我们正在搜索的字符串出现在第一行时,我的代码崩溃。rfind()函数给出了意外的指针。有解决此问题的建议吗?
    RemoveLine(myString, std::string("cv_take_Case::newFunction"));
    
    #include <regex>
    #include <string>
    #include <iostream>
    
    main() {
    std::string text = "Stuff\nBla bla SomeFunction bletch\nThings\n";
    std::regex badLine("\n.*SomeFunction.*\n");
    std::cout << std::regex_replace(text, badLine, "\n");
    }