2011-08-11 24 views
1

ファイルパスの設定済みのパラメータを置き換えることができないような正規表現の置き換えの問題があります。ファイルパスのための検索/置換boost regex C++

正規表現は完璧ではないかもしれないが、それは正常に動作するようです:ここで

は、私がこれまで持っているものです。

正規表現:^(?<path>[^\\/*?<>|]+)\\\\(?<filename>.+)\\.(?<ext>.mp4$)

ファイル名の一致結果名:$2

それでは、これは拡張子がmp4形式があるファイルのリストを検索し、設定された一致結果を使用しているやっている、それはとしてそれを返します。 「ファイル名」。

ターゲット文字列として、

\\\\folder\music\hello.mp4

結果のファイル名=「hello」を

私は何をしたいのは、正規表現の試合の結果のいずれかを取ることができると置き換えることができるようです設定された設定によるファイル/拡張子/パスの名前。

だから誰かが一致したすべての結果がファイル名を「さようなら」に置き換えたいのであれば、これをどうやって達成するのですか?これは私が今持っているものです。

std::string sz_regex_pattern("^(?<path>[^\/*?<>|]+)\\(?<filename>.+)\.(?<ext>.mp4$)"); 
boost::cmatch rm; 
boost::regex pattern(sz_regex_pattern, regex::icase|regex_constants::perl); 
std::string complete_file_name_path = "\\folder\music\hello.mp4"; 
bool result = boost::regex_match(complete_file_name_path , rm, pattern); 
std::string old_filename= rm.format("$2"); // returns the name of the file only 

こんにちは\動作しているように見えますが、フォルダはそうと同じ名前ではありませんファイル名に限り、 \\フォルダ\音楽は何\ hello.mp4は以下regex_replaceの持つ問題点を持っているでしょう。

std::string new_filename = "goodbye"; 

std::string sz_new_file_name_path = boost::regex_replace(complete_file_name_path, old_filename, new_filename); 

ので、私は後に、

boost::filesystem::rename(complete_file_name_path, sz_new_file_name_path); 

任意の助けいただければ幸いできます。

答えて

2

新しいパスを構築するために必要なすべてのコンポーネントが既にあるので、検索と置換は完全に不要です。

^(.*?)\\?([^\\]+)\.([a-zA-Z0-9]+)$
編集またはそれ以下の特定^(.*?)\\?([^\\]+)\.([^.]+)$非:あなたはおそらくとあなたが持っているものを見るためにコンポーネントを分割でき

std::string sz_new_file_name_path = boost::regex_replace(complete_file_name_path, old_filename, new_filename); 

// path + newFileName + ext 
std::string sz_new_file_name_path = rm.format("$1") + "\\" + new_filename + "." + rm.format("$3") 
+0

私はいくつかのより多くの本について考えて交換が不要です。 – EdM

0

WITH

REPLACE無効化

$ 1 =パス $ 2 =ファイル名 $ 3 =拡張

パス、ファイル名と拡張子の間にセパレータが捕捉されていません。
この情報を使用すると、独自の新しい文字列を作成できます。

あなたは、特にこのようなmp4の何かが働くだろうと言うのために検索したい場合は、次の

^(.*?)\\?([^\\]+)\.mp4$