2016-09-29 3 views
0

Ich bin ziemlich vertraut mit Regex, aber ich bin nicht vertraut mit C++ 11 std::regex_replace. Ich verbrachte mehr als eine Stunde damit, herauszufinden, wie man eine einfache Dateierweiterung ersetzt, aber nichts funktioniert!Regex Ersatz Dateierweiterung Präfix Platzierung funktioniert nicht - ersetzen Übereinstimmungen

Was ich erreichen möchte, ist ziemlich einfach. Ich möchte myfile.pdf durch myfile.txt ersetzen. Also schrieb ich meine Regex Dateien übereinstimmen, die mit .pdf Ende:

std::regex regex("^.*\\.(pdf)$") 

Und nach a reference und nach einem cheat-sheet, ich mag das Präfix sehen (was auch immer vor einem Spiel kommt), so verwende ich:

std::string myStr = std::regex_replace(std::string("HiThere.pdf"), regex, std::string("$`")) 
std::cout<< myStr <<std::endl; 

Und ich bekomme eine leere Zeichenfolge! Das passiert, obwohl ich ein Match bekomme! Um zu zeigen, dass ich eine Übereinstimmung erhalte, ersetze einfach "$" durch "$ 1", und du wirst sehen, dass die erste Übereinstimmung die ganze Zeichenfolge ersetzt.

Eine Seitennotiz, nach allen Referenzen, $ 0 sollte die ganze Zeichenfolge anzeigen, aber das tut es nicht!

Alles, was ich erreichen möchte, ist, diese Übereinstimmung durch ".txt" zu ersetzen. Was mache ich hier falsch?

+0

@LightnessRacesinOrbit Ich glaube, ich sehe das Problem ... Danke. Lass mich es nochmal versuchen. –

+0

Benötigen Sie wirklich eine Regexp, um '.pdf' durch '.txt' am Ende eines Strings zu ersetzen? – Holt

+0

@Holt Es ist der sauberste und kürzeste Weg es zu tun (das ich kenne). –

Antwort

0

"$` "wird leer sein, da Sie die gesamte Eingabezeichenfolge gefunden haben.
Es ist ein Präfix für die Übereinstimmung, nicht die erste Rückreferenz.

std::regex regex("^(.*)\\.pdf$"); 
const std::string myStr = std::regex_replace(
    "HiThere.pdf", 
    regex, 
    "$1.txt" 
); 
std::cout << myStr << '\n'; 
1

Dies ist das richtige Verhalten:

Sie können Ihr Ziel ganz einfach erreichen. $ `ist die Zeichenfolge vor das Spiel - aber Sie haben die ganze Zeichenfolge abgestimmt! (So ​​$ ist leer).

Ich glaube, Sie auch erfassen müssen die .*, anstatt die .pdf (Sie wissen, was das ist, nachdem alle!). Ich denke, was Sie wollen, ist:

std::regex regex("^(.*)\\.pdf$") 
std::string source("HiThere.pdf"); 
std::string myStr = std::regex_replace(source, regex, "$1.txt"); 

oder sogar:

std::regex regex("\\.pdf$") 
std::string source("HiThere.pdf"); 
std::string myStr = std::regex_replace(source, regex, ".txt"); 
+0

Yup, hast du - aber ich habe das nicht gesehen, bis ich den Submit-Button gedrückt habe. –