2009-08-10 9 views
23

Sto solo ottenere la mia testa intorno le espressioni regolari, e sto utilizzando la spinta libreria Regex.Come per sfuggire a una stringa per l'uso in Boost Regex

Ho bisogno di usare un'espressione regolare che include un URL specifico, e soffoca perché ovviamente ci sono caratteri nell'URL che sono riservati per l'espressione regolare e devono essere sottoposti a escape.

C'è qualche funzione o metodo nella libreria Boost per sfuggire a una stringa per questo tipo di utilizzo? So che ci sono tali metodi nella maggior parte delle altre implementazioni regex, ma non ne vedo uno in Boost.

In alternativa, c'è un elenco di tutti i personaggi che avrebbe bisogno di essere sfuggito?

risposta

32
.^$ | () [ ] { } * + ? \ 

Ironia della sorte, è possibile utilizzare una regex per sfuggire l'URL in modo che possa essere inserita in un'espressione regolare.

const boost::regex esc("[.^$|()\\[\\]{}*+?\\\\]"); 
const std::string rep("\\\\&"); 
std::string result = regex_replace(url_to_escape, esc, rep, 
            boost::match_default | boost::format_sed); 

(La bandiera boost::format_sed specifica di utilizzare il formato stringa di sostituzione di sed. In sed, un'uscita sfuggirà & qualunque sia corrisposto l'intera espressione)

Oppure, se non si ha familiarità con la stringa di sostituzione di sed formato, basta cambiare la bandiera a boost::format_perl, ed è possibile utilizzare il familiare $& per riferirsi a ciò che di pari passo con l'intera espressione.

const std::string rep("\\\\$&"); 
std::string result = regex_replace(url_to_escape, esc, rep, 
            boost::match_default | boost::format_perl); 
+0

Ho provato ad utilizzare una regex per farlo, ma sono ancora abbastanza incompetente, e le cose strane erano verificano: p ho ordinato oggi un paio di libri su regex quindi spero la mia ignoranza avrà vita breve! Nel frattempo, usando una normale sostituzione di stringhe per sfuggire a questi personaggi, ho lavorato per le mie necessità immediate, grazie. – Gerald

+0

ho aggiunto un po 'di codice per la mia risposta che io * penso * dovrebbe funzionare per aggiungere una barra rovesciata prima di ogni carattere che deve essere sfuggito. Non ho usato boost in un po ', quindi non ci sono garanzie. – Amber

+7

Era vicino, doveva solo aggiungere una "e" alla fine di rep e ha funzionato. Grazie. – Gerald

4

Stessa cosa con boost::xpressive:

const boost::xpressive::sregex re_escape_text = boost::xpressive::sregex::compile("([\\^\\.\\$\\|\\(\\)\\[\\]\\*\\+\\?\\/\\\\])"); 

std::string regex_escape(std::string text){ 
    text = boost::xpressive::regex_replace(text, re_escape_text, std::string("\\$1")); 
    return text; 
} 
11

Utilizzando il codice da Dav (+ una correzione dai commenti), ho creato ASCII funzione/Unicode regex_escape():

std::wstring regex_escape(const std::wstring& string_to_escape) { 
    static const boost::wregex re_boostRegexEscape(_T("[.^$|()\\[\\]{}*+?\\\\]")); 
    const std::wstring rep(_T("\\\\&")); 
    std::wstring result = regex_replace(string_to_escape, re_boostRegexEscape, rep, boost::match_default | boost::format_sed); 
    return result; 
} 

Per ASCII versione, l'uso std::string/boost::regex invece di std::wstring/boost::wregex.

Problemi correlati