2009-12-13 75 views
1

我已经的std :: string与follwing格式简单通配符匹配的std :: string

std::string s = "some string with @lable" 

我必须要找到的“@”的所有实例,然后在之后找到标识符“@”, 这个ID有一个值(在这种情况下,'lable'存储在查找表中,然后我将用找到的值替换@和id。

例如,假设ID标签的值为' 1000'后,字符串将如下所示:

"some string with 1000" 

我的第一个版本使用了boost :: regex,但是当我被告知在接下来的几个版本中不允许使用新的库时,我不得不转储它。

所以有一些优雅的方式来做到这一点与香草std ::字符串和标准算法?

+3

您不允许使用新图书馆,但您可以自行编写新图书馆? – 2009-12-13 15:22:31

+0

这是我在dilbert世界的生活;( – Eli 2009-12-13 19:11:16

+1

我认为这是正则表达式实际上会是一个矫枉过正的情况,这种情况会比较慢,而且在Boost中,我甚至不认为在这种情况下可以节省loc或复杂度。 – wilhelmtell 2009-12-13 19:52:57

回答

10

您可以使用std::find搜索@,并获得一对迭代器,形成一个从@开始到下一个空白字符(或字符串结尾)的范围。然后只需将迭代器传递给std::string::replace()即可完成实际的子字符串替换。

例如:

std::string s = "some string with @lable"; 
std::string::iterator beg = std::find(s.begin(), s.end(), '@'); 
std::string::iterator end = std::find(beg, s.end(), ' '); 
s.replace(beg, end, "whatever"); 

如果你也想数之类的标签或回车空格,你可以使用带有::isspace一起std::find_if

+0

+1。Mine可能是过度杀毒 – 2009-12-13 14:36:28

+1

不要忘记检查你是否真的找到了要替换的东西,你没有提到输入的约束条件,如果字符串中可能存在一个以上的ID,如果一个人总是在场等等...... – 2009-12-13 14:37:46

1

是的。使用std :: find搜索@,然后使用std :: find搜索空间,并将所有内容复制到一边。