2017-06-20 8 views
-4

Supposons que j'ai une chaîne comme ci-dessousObtenir un mot ou une chaîne sous de chaîne principale lorsque char « » de RHS se trouve, puis effacer reste

entrée ="\\ chemin \ myfiles Ceci est mon aiguillon "

sortie =myfiles

de RHS lorsque le premier caractère '\' est trouvé à passer le mot (c.-à-myfiles) et effacez le reste. Ci-dessous est mon approche je fatigué mais c'est mauvais parce qu'il y a une erreur d'exécution comme ABORTED TERMINE AVEC UN NOYAU.

Veuillez suggérer le moyen le plus propre et/ou le plus court pour obtenir un seul mot (c.-à-d. MYFILES) de la chaîne ci-dessus?

Je recherche et essayer de deux derniers jours, mais pas de chance .please aider

Note: La chaîne d'entrée dans l'exemple ci-dessus ne hardcoded comme il doit être .La chaîne contient des changements dynamiquement mais char « \ 'disponible à coup sûr.

std::regex const r{R"~(.*[^\\]\\([^\\])+).*)~"} ; 
std::string s(R"(" //PATH//MYFILES  This is my sting ")); 
std::smatch m; 
int main() 
{ 

if(std::regex_match(s,m,r)) 
{ 
std::cout<<m[1]<<endl; 

} 
} 
} 
+1

Vraiment pas de raison d'utiliser une regex ici. Vous pouvez utiliser 'find_last_of' et' find' en conjonction avec 'substr' pour obtenir le mot assez facilement. – NathanOliver

+0

je vous remercie pour la réponse pouvez-vous s'il vous plaît montrer avec un petit exemple – user7953556

+1

Je me souviens d'une question * très * similaire à celui-ci affiché ce matin. Il contenait plusieurs suggestions utiles mais il semble qu'il ait été supprimé depuis ... –

Répondre

0

Pour effacer la partie d'une chaîne, vous devez trouver où commence et se termine cette partie. Trouver quelque chose à l'intérieur d'un std::string est très facile parce que la classe a six méthodes intégrées pour cela (std::string::find_first_of, std::string::find_last_of, etc.). Voici un petit exemple de la façon dont votre problème peut être résolu:

#include <iostream> 
#include <string> 

int main() { 
    std::string input { " \\PATH\\MYFILES This is my sting " }; 
    auto pos = input.find_last_of('\\');  

    if(pos != std::string::npos) { 
     input.erase(0, pos + 1); 

     pos = input.find_first_of(' '); 
     if(pos != std::string::npos) 
      input.erase(pos); 
    } 

    std::cout << input << std::endl; 
} 

Note: montre pour escape sequences, une seule barre oblique inverse est écrit "\\" dans une chaîne littérale.