2016-12-02 62 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你很可能會做同樣::串。

然後,你的方法不能工作,因爲你的副本是獨立的空間的位置。不幸的是,您只能刪除標點符號周圍的空格,而不能刪除單詞之間的空格。

稍微修改你的代碼,你可以延遲等待第一個非空格值的空間副本:如果它不是一個標點符號,你需要在字符前複製一個空格,否則你只需複製非空格字符從而擺脫了空間。

同樣,一旦你複製標點符號只是循環,並將餘下的空間,直到第一個非空格字符。

我可以編寫代碼。這本來是短。但我更願意讓你在完全理解方法的基礎上完成作業。