0

「/path/file.extension」のような文字列を別の指定された拡張子に変更するコードを作成しようとしています。そのためにboost::xpressiveを使用しようとしています。しかし、私は問題を抱えています。出力にガベージ文字が表示されるようです。

#include <iostream>
#include <boost/xpressive/xpressive.hpp>

using namespace boost::xpressive;
using namespace std;


int main()
{
    std::string str( "xml.xml.xml.xml");
    sregex date = sregex::compile( "(\\.*)(\\.xml)$");

    std::string format( "\1.zipxml");


    std::string str2 = regex_replace( str, date, format );
    std::cout << "str  = " << str << "\n";
    std::cout << "str2 = " << str2 << "\n";

    return 0;
}

コンパイルして実行します。

[bitdiot@kantpute foodir]$ g++ badregex.cpp
[bitdiot@kantpute foodir]$ ./a.out > output
[bitdiot@kantpute foodir]$ less output
[bitdiot@kantpute foodir]$ cat -vte output
str  = xml.xml.xml.xml$
str2 = xml.xml.xml^A.zipxml$

上記の例では、出力をファイルにリダイレクトし、cat を使用して印刷できない文字を出力します。str2 の ctrl-A に注目してください。

とにかく、ブーストライブラリを間違って使用していますか? これはブーストバグですか?「.tail」を他の文字列に置き換えることができる、使用できる別の正規表現はありますか? (私の例では修正されています。)

ありがとう。

4

2 に答える 2

3

少なくとも私が物事を読んでいる限り、犯人はここにいます: std::string format( "\1.zipxml");.

バックスラッシュをエスケープするのを忘れたので\1、コントロール A を与えています。あなたはほぼ確実\\1に .

別の方法として (コンパイラが十分に新しい場合)、代わりに生の文字列を使用することもできます。したがって、次のようR"(\1.zipxml)"になります: 、バックスラッシュをエスケープする必要はありません。C++文字列でREを書いている場合、生の文字列はほとんどあなたの新しい親友であるという事実を除いて、私はおそらくこれについて言及することを気にしません.

于 2013-02-06T15:15:23.837 に答える
1

ジェリー・コフィンが私に指摘したように。それは私の愚かな間違いでした。

誤ったコードは次のとおりです。

std::string format( "\1.zipxml");

これは次のものに置き換える必要があります。

std::string format( "$1.zipxml");

助けてくれてありがとう。

于 2013-02-06T15:32:47.227 に答える