2016-12-02 64 views
2

前取消字符串中的空格我可以像一个字符串:期和逗号

在这段时间内,债券满足了惊人的国税局,他引诱人。

我需要删除逗号前和整个字符串中的句号之前的多余空格。我试图把它扔到一个char向量中,如果当前字符是“”,并且后面的字符是“。”,那么它就不是push_back。或“,”但它不起作用。我知道有一种简单的方法可以使用trim(), find()erase()或某种regex,但我并不是最熟悉正则表达式。

+2

它认为无论是'regex_replace'或'find'和在循环中字符串'erase'将是你所需要的。 – NathanOliver

+0

小心引号。当前字符不能是''“',因为这是一个字符串文字。它可以是'''',因为这是一个字符常量。 –

+0

@PeteBecker是的,谢谢你指出。我只是想让问题更容易阅读。但你是正确的字符常量是在''''形式。 –

回答

1

解决方案公司(使用正则表达式库):

std::string fix_string(const std::string& str) { 
    static const std::regex rgx_pattern("\\s+(?=[\\.,])"); 
    std::string rtn; 
    rtn.reserve(str.size()); 
    std::regex_replace(std::back_insert_iterator<std::string>(rtn), 
        str.cbegin(), 
        str.cend(), 
        rgx_pattern, 
        ""); 
    return rtn; 
} 

该函数需要输入一个字符串并“修复空间问题”。

Here a demo

+0

谢谢你使用'regex'提供一个答案,因为我想更加熟悉它。我理解模式的某些部分,但不是全部。有没有一个你会推荐的参考?我试图拼凑大多数时候其他问题的表达不成功。 –

+1

@ user5468794我可以建议在YouTube上看到一些关于*正则表达式的视频。请注意,在我的代码中有一个技巧:在C/C++中,为了产生反斜杠,您需要使用另一个反斜杠进行转义。所以我的例子中真正的正则表达式应该是:'“\ s +(?= [\。,])”' –

1

环路上搜索字符串“”如果你发现一个替换为“‘:

std::string str = "..."; 
while(true) { 
    auto pos = str.find(" ,"); 
    if(pos == std::string::npos) 
     break; 
    str.replace(pos, 2, ","); 
} 

做相同的’。”如果你需要处理不同的空间符号,如制表符使用正则表达式和适当的组。

1

我不知道如何使用正则表达式的C++,也不知道如果C++支持PCRE正则表达式,无论如何我发布这个正则表达式的答案(我可以删除它,如果它不适用于C + +)。

你可以使用这个表达式:

\s+(?=[,.]) 

Regex demo

+0

如果你看看答案你是正确的。它的确适用于C++,谢谢。 –

0

首先,有没有必要使用炭的载体:通过使用STD你很可能会做同样::串。

然后,你的方法不能工作,因为你的副本是独立的空间的位置。不幸的是,您只能删除标点符号周围的空格,而不能删除单词之间的空格。

稍微修改你的代码,你可以延迟等待第一个非空格值的空间副本:如果它不是一个标点符号,你需要在字符前复制一个空格,否则你只需复制非空格字符从而摆脱了空间。

同样,一旦你复制标点符号只是循环,并将余下的空间,直到第一个非空格字符。

我可以编写代码。这本来是短。但我更愿意让你在完全理解方法的基础上完成作业。