3

私はこれを機能させるためにバティに行きます。これが私がこれまでに持っているものですが、ça n​​e marche pas.

const std::string singleslash("\\\\\\\\");
const std::string doublequote("\\\"\"\\");
const std::string doubleslash("\\\\\\\\\\\\");
const std::string slashquote("\\\\\\\\\"\\");

std::string temp(Variables);
temp.assign(boost::regex_replace(temp,boost::regex(singleslash),doubleslash,boost::match_default));
temp.assign(boost::regex_replace(temp,boost::regex(doublequote),slashquote,boost::match_default));

誰か私を救ってください。

更新regex_replace を適切に使用していないようです。これもうまくいかない簡単な例です...

std::string w("Watermelon");
temp.assign(boost::regex_replace(w,boost::regex("W"),"x",boost::match_all | boost::format_all));
MessageBox((HWND)Window, temp.c_str(), "temp", MB_OK);

これにより、「xatermelon」ではなく「Watermelon」が表示されます

更新 2 boost::regex の使用が間違っています...これは機能します

boost::regex pattern("W");
temp.assign(boost::regex_replace(w,pattern,std::string("x")));

Update 3最終的に機能したのは次のとおりです

std::string w("Watermelon wishes backslash \\ and another backslash \\ and \"\"fatness\"\"");
temp.assign(w);

MessageBox((HWND)Window, temp.c_str(), "original", MB_OK);

const boost::regex singlebackslashpat("\\\\");
const std::string doublebackslash("\\\\\\\\");
temp.assign(boost::regex_replace(w,singlebackslashpat,doublebackslash));
MessageBox((HWND)Window, temp.c_str(), "double-backslash", MB_OK);

const boost::regex doublequotepat("\"\"");
const std::string backslashquote("\\\\\\\"");
temp.assign(boost::regex_replace(temp,doublequotepat,backslashquote));
MessageBox((HWND)Window, temp.c_str(), "temp", MB_OK);
4

2 に答える 2

3

したがって、私はboost::regexの専門家ではなく、現在のところBoostを便利にインストールしていませんが、これを段階的に実行してみましょう.

照合するパターン

入力の二重引用符に一致させるには、正規表現で二重引用符が必要です (正規表現では二重引用符は魔法ではありません)。つまり、必要なのは二重引用符を含む文字列だけです。"\""大丈夫なはずです。

入力のバックスラッシュに一致させるには、正規表現でエスケープされたバックスラッシュが必要です。これは、2 つの連続したバックスラッシュを意味します。これらのそれぞれは、文字列リテラルで再度 2 倍にする必要があります。だから"\\\\"。[編集: 以前は 4 つではなく 8 つ入力しましたが、これは間違いでした。]

出力形式

繰り返しますが、二重引用符は一致置換形式 (または適切な用語が何であれ) では魔法ではありませんが、バックスラッシュは魔法です。したがって、出力に 2 つのバックスラッシュを取得するには、文字列に 4 つ必要です。つまり、文字列リテラルに 8 つ必要です。だから:"\\\\\\\\"

バックスラッシュの後に二重引用符を付けるには、文字列は 2 つのバックスラッシュと二重引用符である必要があり、文字列リテラルではそれらすべての前にバックスラッシュを付ける必要があります。だから:"\\\\\""

[コピーと貼り付けを容易にするために実際のコードを追加するために編集しました:]

const std::string singleslash("\\\\");
const std::string doublequote("\"");
const std::string doubleslash("\\\\\\\\");
const std::string slashquote("\\\\\"");

一致するフラグ

tofutim の更新を読んだ後、検索しようとしましたmatch_allが、ドキュメントが見つかりませんでした。ただし、これは一致フラグ値の可能性があるように見えます。また、それが定義されているヘッダー ファイルの横には、「match_any が設定されていても、入力全体を検索する必要があります」という不可解なコメントがあります。に添付された同様に不可解なコメントmatch_anyは、「一致するものは気にしない」です。それが何を意味するのかはわかりませんが、これらのフラグは非推奨か何かのように見えますが、いずれにせよ、おそらくそれらを使用したくないでしょう。

(ソースをざっと見てみるとmatch_all、入力の最後で終了する場合にのみ一致を受け入れることができると思います。そのため、修正したテスト ケースnの代わりに置換を試して、それが機能するかどうかを確認してください。別の方法として、Wおそらく私は何かを見逃しており、入力全体と一致する必要があり、 orWatermelonの代わりに置き換えることで確認できます. または、これに興味がない場合は、気にすることはできません.)Wn

試してみて、また報告してください...

于 2012-07-12T22:21:02.190 に答える
1

ここではブーストはありませんが、single(back)slashは正規表現で\\として記述する必要があります。したがって、c++文字列リテラルは4つのバックスラッシュです。置換文字列はエスケープしてC++で再度実行する必要があるため、8つのバックスラッシュが必要です。

正規表現の二重引用符はエスケープしてはならないため、「」であり、C ++\"\"です。置換は再度エスケープする必要があるため、その\\"、そしてもちろんC ++であるため、\\\\\"になります。

アップデート3によると、パターンと置換文字列は次のように初期化する必要があります。

const std::string singleslashpat("\\\\");
const std::string doublequotepat("\"\"");
const std::string doubleslash("\\\\\\\\");
const std::string slashquote("\\\\\"");
于 2012-07-12T22:23:54.067 に答える