前提・実現したいこと
C++の std::regex において、任意の文字列に含まれる「文字としての(バックスラッシュ)」を置換することは可能でしょうか?
※任意の文字列はプログラム外から与える事を想定しているため、任意の文字列には「\」1文字が存在することがあります。
欲しい結果
プログラムの外部から文字列を指定し、その文字列に含まれる「\」を「\」に置換し出力したいと思っています。
例えば、コンソール上で次のようにすると、
text
1user> app.exe あい\うえお\かきくけこ
次の結果を得たいと思っています。
text
1あい\うえお\かきくけこ
試したこと
次の3つの方法で試しました。
- バックスラッシュをバックスラッシュでエスケープして実施(PatternA1)
- バックスラッシュをバックスラッシュでエスケープして実施(PatternA2)
- 生文字リテラルを用いて実施(PatternB)
また、対象とした文字列は次の3つです。
0. 表層
0. 予想予
0. あい\うえお\かきくけこ
以下にソースコードを示します。
C++
1#include <string> 2#include <regex> 3#include <iostream> 4 5void dispResultPatternA1(std::string inputStr) { 6 std::cout << "\t" << inputStr << " -> " << std::regex_replace(inputStr, std::regex("\"), "\\") << std::endl; 7} 8void dispResultPatternA2(std::string inputStr) { 9 std::cout << "\t" << inputStr << " -> " << std::regex_replace(inputStr, std::regex("\\"), "\\") << std::endl; 10} 11void dispResultPatternB(std::string inputStr) { 12 std::cout << "\t" << inputStr << " -> " << std::regex_replace(inputStr, std::regex(R"(\)"), "\\") << std::endl; 13} 14int main(int argc, char* argv[]) { 15 if (argc != 4) { return 1; } 16 17 std::string s1_Before = argv[1];//第一引数 ... あい\うえお\かきくけこ 18 std::string s2_Before = argv[2];//第二引数 ... 表層 19 std::string s3_Before = argv[3];//第三引数 ... 予想予 20 21 std::cout << " ● PatternA1" << std::endl; 22 try { 23 dispResultPatternA1(s1_Before); 24 dispResultPatternA1(s2_Before); 25 dispResultPatternA1(s3_Before); 26 } 27 catch (std::regex_error& e) { 28 std::cout << "\t" << e.what() << std::endl; 29 } 30 31 std::cout << " ● PatternA2" << std::endl; 32 try { 33 dispResultPatternA2(s1_Before); 34 dispResultPatternA2(s2_Before); 35 dispResultPatternA2(s3_Before); 36 } 37 catch (std::regex_error& e) { 38 std::cout << "\t" << e.what() << std::endl; 39 } 40 41 std::cout << " ● PatternB" << std::endl; 42 try { 43 dispResultPatternB(s1_Before); 44 dispResultPatternB(s2_Before); 45 dispResultPatternB(s3_Before); 46 } 47 catch (std::regex_error& e) { 48 std::cout << "\t" << e.what() << std::endl; 49 } 50 51 getchar(); 52 return 0; 53}
その結果次の様になりました。
そもそもPatternAでうまくいくと思ってましたがエラーが出てしまいます。そこで、エスケープのエスケープで置換したらいいのでは?と思いPatternA2で試してみました。すると、第一引数の文字列は欲しい結果となったのですが、他の特定の文字(ここでは、「表」「予」)も置換の対象となってしまいました。他に方法はないか調べていると、「生文字リテラル」なるものがあり、それで試してみると(PatternB)、PatternA2と同じ結果となりました。
text
1 ● PatternA1 2 regex_error(error_escape): The expression contained an invalid escaped character, or a trailing escape. 3 ● PatternA2 4 あい\うえお\かきくけこ -> あい\うえお\かきくけこ 5 表層 -> 表\層 6 予想予 -> 予\想予\ 7 ● PatternB 8 あい\うえお\かきくけこ -> あい\うえお\かきくけこ 9 表層 -> 表\層 10 予想予 -> 予\想予\
回答3件
あなたの回答
tips
プレビュー