String mit regex zerlegen



  • Hallo Gemeinde,

    ich versuche schon den ganzen Abend den folgenden String mit regex zu zerlegen.

    30CF05!381TRACK_1:MOLCH.BI0001  30CF05!381TRACK_1:MOLCHCA0.BO01
    
    std::string line;
    
      std::smatch match;
      std::regex rex("(\\w)+");
    
      std::regex_match(line, match, rex);
      std::string s1 = match.str();
    

    Wie müßte rex den aussehen, damit ich in match

    30CF05
    381TRACK_1
    MOLCH.BI0001
    30CF05381TRACK_1
    MOLCHCA0.BO01
    

    finde. Irgendwie stelle ich mich gerade ein wenig prasselig an.


  • Mod

    Ist deine Aufteilung fehlerhaft, oder was genau soll die Regel sein?



  • Nunja ich habe eine Datei in der die Zeilen so aufgebaut sind wie im Beispiel.

    Nun brauche ich je Zeile die 6 Teilstrings die durch "!: " getrennt sind. Normal würde ich dass durch strtok erledigen, dachte aber regex könnte das schneller/eleganter.


  • Mod

    andreasgeorg schrieb:

    Nun brauche ich je Zeile die 6 Teilstrings die durch "!: " getrennt sind.

    Und wie ist "30CF05381TRACK_1" zustande gekommen?



  • Arcoth schrieb:

    Und wie ist "30CF05381TRACK_1" zustande gekommen?

    Schlamperei beim Erstellen der Frage 👎 . Mea culpa.

    Hätte natürlich so

    30CF05
    381TRACK_1
    MOLCH.BI0001
    30CF05
    381TRACK_1
    MOLCHCA0.BO01
    

    aussehen müssen.



  • warum nicht einfach nach !, : und Blank zerlegen?
    ist ein Regex-Splitter nicht ein wenig zu viel Power für so wenig Bedarf?
    Oder willst du auch validieren - dafür reichen die Informationen die du gegeben hast aber auch nicht aus



  • Unabhängig davon, dass ich Gast3 recht gebe, dass hier ein einfaches Splitten auch reicht:

    Wie wäre es beispielsweise mit

    ([A-Z0-9]+)!([A-Z0-9_]+):([A-Z0-9\.]+)\s+([A-Z0-9]+)!([A-Z0-9_]+):([A-Z0-9\.]+)
    

    Der Teil vor und nach

    \s+
    

    ist identisch:

    ([A-Z0-9]+)!([A-Z0-9_]+):([A-Z0-9\.]+)
    


  • Danke für die Hilfe und die Kommentare.

    Nein, es geht nur um das einfache Zerlegen. Ich habe eine Datei mit ca. 500MB wo jede Zeile die beschriebene Struktur hat. Mir ist durchaus bewußt, dass ein Tokenizer für die Aufgabe völlig ausreicht.
    Da ich aber noch nie mit regex gearbeitet habe, wollte ich einfach mal sehen wie das funktioniert. Und zugegebener Maßen bin ich etwas erschlagen von den "Filterausdrücken".



  • andreasgeorg schrieb:

    Und zugegebener Maßen bin ich etwas erschlagen von den "Filterausdrücken".

    Es ist wie mit vielem: Wenn du weißt, welche Zeichen in der Regex welche Bedeutung haben was bedeuten, wirst du feststellen, dass diese Regex sehr simpel ist.


Anmelden zum Antworten