regex zusammensetzen



  • Hi,

    ich will zwei std::regex zusammensetzen, aber irgendwie finde ich in den Referenzen keine Funktion dafür?

    regex r1 ( "[^<]*" );
    regex r2 ( "<" );
    regex r3 = /* r1 + r2 */;
    

    Wie könnte ich das realisieren.

    Danke im Voraus.



  • Einfach die Strings zusammenaddieren?



  • hääääää schrieb:

    Einfach die Strings zusammenaddieren?

    Das will ich vermeiden, weil ich will, dass meine Funktionen std::regex zurückgeben. Ich will

    regex_search( get_regex() );
    

    schreiben

    und nicht

    regex_search( regex( get_regex() ) );
    

    schreiben

    Ich mach mal eben ein Beispiel: Ich will einen Link aus einen html-Dokument und manchmal auch den Linktext. Wenn ich den Linktext nicht brauche, will ich auch nicht nach ihm suchen. Darum hab ich zwei Funktionen.
    ➡ Eine die nur nach einem Link sucht.
    ➡ Eine die nach einem Link und dem dazugehörigen Text sucht.

    #include <iostream>
    #include <regex>
    #include <string> 
    using namespace std;
    
    regex regex_for_links( const string& link_pattern )
    {
    	const string pattern_start = "<\\s*A\\s+[^>]*href\\s*=\\s*\"(";
    	const string pattern_end   = ")\"";
    	const string pattern = pattern_start + link_pattern + pattern_end;
    
    	return regex( pattern, regex::icase );
    }
    
    regex regex_for_links_and_texts( const string& link_pattern, const string& text_pattern )
    {
    	const string text_pattern_start = "[^>]*>\\s*(";
    	const string text_pattern_end   = ")\\s*<\\s*/A\\s*>";
    	const string pattern            = text_pattern_start + text_pattern + text_pattern_end;
    
    	return /* regex_for_links(link_pattern) + regex(pattern, regex::icase) */; // Was mache ich hier nun am besten?
    }
    
    int main()
    {
    	string html( "<a href=\"google.de\"> google </a>" );
    
    	{ // NUR LINKS
    		smatch m;
    		regex_search( html, m, regex_for_links("[^\"]*") );
    
    		for(auto found : m)
    			cout << found << '\n';
    	}
    
    	{ // LINKS + TEXTE
    		smatch m;
    		regex_search( html, m, regex_for_links_and_texts("[^\"]*", "[^\"]*") );
    
    		for(auto found : m)
    			cout << found << '\n';
    	}
    }
    


  • Unten hab ich aus Versehen einen copy&paste Fehler gemacht:

    regex_search( html, m, regex_for_links_and_texts("[^\"]*", "[^<]*") );
    


  • Ich würde regex_search immer beides suchen lassen und dann aus smatch entweder nur den Link oder beides nehmen.


Anmelden zum Antworten