私は、いくつかのURIで構成される文字列の醜い混乱を抱えています。私がやりたい何std :: regexを使用して入力をフィルタリングする
:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/0_301_0.svg,:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/02011.svg,:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/02012.svg,:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/02110000.svg
は文字:/.,
のすべての発生を取り除くので、私は有効なファイル名になり、単一の文字列を持つことができます。
私はこの簡単な正規表現を書いています。[^(:/,.)]
http://www.regexpal.com/によると正しい正規表現です。
しかし、次のC++コードを実行すると、期待していたもの(英数字とアンダースコアのみ)が返されません。シーケンスの最初の英数字が返されます。S
私はstd :: regexで間違って何をしていますか、正規表現をオフにしていますか?
#include <iostream>
#include <regex>
#include <string>
static const std::string filenames {R"(:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/0_301_0.svg,:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/02011.svg,:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/02012.svg,:/SymbolStandards/JMSymbology/MIL_STD_2525D_Symbols/02110000.svg)"};
static const std::regex filename_extractor("[^(:/,.)]");
int main() {
std::smatch filename_match;
if(std::regex_search(filenames, filename_match, filename_extractor))
{
std::cout << "Number of filenames: " << filename_match.size() << std::endl;
for(std::size_t i = 0; i < filename_match.size(); ++i)
{
std::cout << i << ": " << filename_match[i] << std::endl;
}
}
return 0;
}
私はあなたが 'std :: regex_replace'を望んでいると思っていますが、これはおそらくregexを全く使わない方が良いでしょう。たぶん[std :: remove_if](http://en.cppreference.com/w/cpp/algorithm/remove)を見てください。 – Galik
私は分かりません。あなたの文字列には、 ':/'はなく、 ':/'が含まれていますか?代わりにそれを分割することはできませんか? – rustyx