2013-12-10 134 views
0

我有一个单空格分隔的字符串,我想替换字段x。替换空格分隔字符串中的字段C++

我可以反复使用find找到x-1和x空格,然后用substr来抓住两边的两个字符串,然后连接两个子字符串和替换文本。

但是,对于那些应该很简单的事情来说,这似乎是一个可怕的工作。有没有更好的解决方案 - 不需要Boost的解决方案?

回答 我已经清理@Domenic Lokies如下回答:

sting fieldReplace(const string input, const string outputField, int index) 
{ 
    vector<char> stringIndex(numeric_limits<int>::digits10 + 2); 
    _itoa_s(index, stringIndex.begin()._Ptr, stringIndex.size(), 10); 
    const string stringRegex("^((?:\\w+){"); //^((?:\w+){$index})\w+ 

    return regex_replace(input, regex(stringRegex + stringIndex.begin()._Ptr + "})\\w+"), "$1" + outputField); 
} 

_itoa_s_Ptr是MSVS只是我相信,所以你需要清理这些了,如果你想代码的可移植性。)

+0

你能举一个你想要的例子吗? –

回答

0

由于C++ 11,你应该使用正则表达式为您的目的。如果您没有使用支持C++ 11的编译器,则可以查看Boost.Regex

千万不要将std::string::findstd::string::replace结合起来,这在C++等语言中并不是很好的风格。

我写了一个简短的例子,告诉你如何在C++中使用正则表达式。

#include <string> 
#include <regex> 
#include <iostream> 

int main() 
{ 
    std::string subject = "quick brown frog jumps over the lazy dog"; 
    std::regex pattern("frog"); 
    std::cout << std::regex_replace(subject, pattern, "fox"); 
} 
+0

我选择这个作为答案,因为我可以得到我想要的。但没有upvote因为这不能解决一般情况。我不知道C++ 11有'regex_replace',我可以用它来一般性地捕获和替换第x个单词,但是您的解决方案要求我已经知道该单词,而我不知道。 –

1

可以使用的string::replace方法之一做到这一点:

  • 找到x-1 -st空间的位置。你可以通过调用string::find反复
  • 通过调用string::find一次
  • 计算字的长度找到x个空间的位置由第二个
  • 呼叫减去第一指标被替换做string::replace传递第一个索引,长度和替换字符串。

这里是你如何实现这一点:

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    string s = "quick brown frog jumps over the lazy dog"; 
    size_t start = -1; 
    int cnt = 3; // Word number three 
    do { 
     start = s.find(' ', start+1); 
    } while (start != string::npos && --cnt > 1); 
    size_t end = s.find(' ', start+1); 
    s.replace(start+1, end-start-1, "fox"); 
    cout << s << endl; 
    return 0; 
} 

Demo on ideone.

+0

+1需要时间来实现这一点,但它确实是我想要避免的代码。 @Domenic Lokies并没有提供完整的解决方案,但我可以动态地创建正则表达式来保存x-1空间,从而找到我正在寻找的单词。 –

+0

我已经采取自由清理@Domenic Lokies在问题中的答案。希望你会同意,只要C++ 11可用,那就是要走的路。 –