1

私の文字列:

std::string With_esc = "asd\b";

それを単純な文字列「as」に変換したい(バックスペース文字を適用して忘れる)。C++でこれを行う方法はありますか? 次のようになります。

std::string With_esc = "asd\b";
std::string Without_esc = With_esc; //Here I should convert it
std::ofstream FWith_esc ("with");
std::ofstream FWithout_esc ("without");
FWithout_esc << Without_esc;
FWith_esc << With_esc;

バッシュ:

~ cat -e with
  asd^H
~ cat -e without
  as

残念ながら、変換方法がわからないため、両方のファイルはまったく同じに見えます。

4

3 に答える 3

4

幸運にも C++11 を使用できると仮定します (それ以外の場合は、このコードをお気に入りの正規表現エンジンに適合させてください)。

string With_esc = R"asd\b";
string Without_esc = regex_replace(With_esc, regex(".\\b"), "");

コメントで指摘されているように、このアプローチには次の制限があります。

  • 「背中」を1つだけ置き換えるので、持っている"12\b\b"場合は"1\b". regex_replace()これを処理するには、入力と出力( for )が異なるまでループする必要があります(または、より良い正規表現、私はそれらが得意ではありません)
  • \bのように文字列の先頭として扱われません"\b123"。これを処理するには、() の後に削除する単純な文字列置換 ( Giobunnyによって提案された手法を使用) が必要です。\bregex_replace
  • ここでは、逐語的な文字列を使用していることに注意してください (たとえば、テキストがファイルから取得されている場合は問題ありませんが、文字列リテラルを使用している場合は、それに応じて正規表現を更新する必要があります)。

更新Eric Finn
が指摘したように、この式は複数のバックスペースにも一致し、その後になります。これは明らかに間違っています。彼が提案したように、より良い正規表現には check for も含める必要があります。"a\b\b\b""\b\b""\""[^\b]\b"

于 2014-07-30T13:22:29.650 に答える
1

正規表現を使用したくない場合は、次のようにしてください。

std::string convertBackspaces(std:string str)
{
    std::string::iterator iter = str.begin();
    std::string::iterator end = str.end();
    while (iter != end)
    {
        iter = std::find(iter, end, '\b');
        if (iter == end) break;
        if (iter == str.begin())
            iter = str.erase(iter);
        else
            iter = str.erase(iter-1, iter+1);
        end = str.end();
    }
    return str;
}

std::string Without_esc = convertBackspaces(With_esc);
于 2014-08-01T07:36:34.423 に答える
0

"\b"部分文字列を空の文字列に置き換えることができます。これは最速/最も安全な方法ではありませんが、うまくいくので従うことができます.

部分文字列を別の部分文字列に置き換える C++

于 2014-07-30T13:21:34.717 に答える