2017-11-15 19 views
1

ファイル名の拡張子を入力テキストファイルから文字列ベクトルに抽出する必要があります。 入力テキストファイルはかなり乱雑で、一部のアプリケーションの設定ファイルとして機能します。テキストファイルからファイル名を抽出する

私が抽出しようとしているファイル名について知っているのは、 'file ='という言葉が前に付いていて、ファイル名が ''か ''の間で引用されているということです。例:file = "name.abc"私はまた、どのようにスペースがあるかについては保証していません:file = "name.abc"、file = "name.abc"、file = "name.abc" ...そして拡張子は異なる長さにすることができます。

だから私は、次のコードを試してみました:

std::vector<std::string> attachment_names; 
std::istringstream words(text_content); 
std::string word; 
std::string pst_extension(".abc"); // My code should support any extension 
while (words >> word) 
{ 
    auto extension_found = word.find(abc_extension); 
    if (extension_found != word.npos) 
    { 
     auto name_start = word.find("'") + 1; 
      //I am not even sure the file is quoted by '' 

     std::string attachment_name = word.substr(name_start, (extension_found + 3) - name_start + 1); 
      //Doing this annoys me a bit... Especially that the extension may be longer than 3 characters 

     attachment_names.push_back(attachment_name); 
    } 
} 

は、これを行うのよりよい方法はありますか?任意の拡張子をサポートするためにファイルキャプションにもっと頼る可能性はありますか?

+2

お待ちください、コードレビューをお探しですか?もしそうなら、あなたは[codereview.se]を見たいかもしれません。 – Rakete1111

+0

私はこのコミュニティについて知りませんでした、ありがとうございました! :) –

+0

あなたの質問が実際にトピックであることを確認し、それを適切に修正するために、そこにヘルプセンターを読みたいかもしれません:)ありがとう – Rakete1111

答えて

1

C++ 11から、またはboostを使用していることをお勧めします。 スペースの数にバラエティーがあり、解析が少し乱雑になるため、この問題の正規表現イテレータで正規表現を使用することをお勧めします。 sregex_iteratorは、テキストとマッチする正規表現をトラバースします(ソースとして、双方向イテレータを使用できます。例えば、getlineで取られた文字列)。非テストのアイデアは、次のとおりです。

static std::regex const filename_re("[[:space:]]*file[[:space:]]*=(.*)[[:space:]]*"); 

std::regex_iterator rit(line.begin(), line.end(), filename_re), end; 


while (rit != end) { 
    cout << rit[1] << ','; 
    ++rit; 
} 

これを、各反復のためのあなたのラインを取って、見つかったファイル名になるだろうし、キャプチャグループは、ファイル名をキャプチャしているので、それを印刷します。

関連する問題