Regex pattern

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von mox.

    Regex pattern

    Hi,

    Gibts ein cleveres Regexpattern um folgendes auszulesen:
    Mein Input sieht ca so aus :



    // jede menge strings davor
    "playstyle":["keyboard","tablet"],...
    ... // jede menge strings danach.



    In den eckigen klammern sind können x-beliebig viele strings aufgelistet sein.
    Es kann auch vorkommen das gar keine werte angeben sind, dann sähe das so aus:


    // blablabla
    ,"playstyle":null," afrgdxvbtrhn5676jmik87
    // balblabla


    Ich möchte per Regexpattern aus meinem Input den identifier playstyle rauspicken, und dann davon die einzelnen werte in ein string array laden.
    D.h. das output string array soltle in meinem beispiel die werte "keyboard" und "tablet" enthalten.
    wenn "null" angegeben ist, sollte das string-array am ende leer sein.

    Gibts da ne clevere regexlösung oder muss ich das per string.split machen?
    C# Developer
    Learning C++
    So? (?<=\"playstyle\":\[)[^\]]*(?=\])|(?<=\"playstyle\":)null

    //Edit: Ups, ne hab das falsch gelesen, damit müsstest du den Inhalt trotzdem noch splitten.

    //Edit2: So aber? (?<=\"playstyle\":\[[^\[\]]*\")[^\",]*(?=\")

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Bluespide“ ()

    Bluespide schrieb:

    Ups, ne hab das falsch gelesen, damit müsstest du den Inhalt trotzdem noch splitten.
    ich find das übrigens nicht weiter schlimm, wenn man ein Regex-Result noch bischen nacharbeiten muss, etwa splitten.
    Bei Regex hat man ja schnell die Neigung, den "eierlegenden WollmilchSau"-Regex zu entwerfen, der die komplette Datenverarbeitung übernimmt.
    Das ist meist sehr mühsam und zeitaufwändig zu entwickeln (besonders, wenn man keinen Regextester nutzt), aber das Ergebnis ist dann leider meist auch kaum noch les-/nachvollzieh-/wart-bar.
    Sonst bin ich immer für optimal kurzen Code - u.a. weil am besten wartbar - aber in dem Fall eben nicht, sondern das geht leicht extrem zu Lasten der Lesbarkeit.
    /OT

    Bluespide schrieb:

    So? (?<=\"playstyle\":\[)[^\]]*(?=\])|(?<=\"playstyle\":)null

    //Edit: Ups, ne hab das falsch gelesen, damit müsstest du den Inhalt trotzdem noch splitten.

    //Edit2: So aber? (?<=\"playstyle\":\[[^\[\]]*\")[^\",]*(?=\")


    Also ich musste noch mehr backslashes einffügen um die anderen backslashes vernünftig zu escpaen usw, allerdings ist
    C# damit nicht ganz glücklich(?) :



    denn wenn ich die zusaätlichen backslashes nicht einfüge..

    C# Developer
    Learning C++

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rikudo“ ()

    ja, das ist natürlich ein Problem, \ in einem c#-String zu notieren. Dafür muss man die Escape-Sequenz kennen.
    Die ist allerdings glücklicherweise in c# immer so,dass man ein \ voranstellt um zu escapen, und das gilt auch für \ selbst ( -> \\).

    vlt. in eim gut c#-Buch nochmal "String-Literale und Escape-Sequenzen" nachlesen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    c# Hat 2 schreibweisen für String-Literale:
    "der string"
    oder
    @"der string"

    Bei der ersten Variante interpretiert c# \ als Beginn einer Escape-Sequenz, und das bewirkt bei dir die rote Unterkringelung.
    Also verwende die 2. Variante, bei derc# keine Escape-Sequenzen interpretiert.
    denn du kannstes grad nicht brauchen, dass c# Escapet, denn du willst ja grad im Regex eine Escape-Sequenz eingeben.

    Näheres dazu, und zu c#-Escape-Sequenzen lies in eim guten Buch nach.


    Danke für diesen Tipp, - auf jeden Fall gut zu wissen!
    Allerdings funktioniert die zweite Variante genauso nicht, selbiges problem ...

    C# Developer
    Learning C++
    Wenn bei C# in einem "Verbatim String" (so heißen die Strings, die mit @ beginnen) ein Anführungszeichen vorkommen soll, dann muss man das, wie in VB, einfach verdoppeln:

    C#-Quellcode

    1. string a = @"Anführungszeichen""hier";
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Alright, thanks!
    This seems to work :

    C#-Quellcode

    1. static void Main(string[] args)
    2. {
    3. string src = File.ReadAllText(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\src.txt");
    4. MatchCollection matches = Regex.Matches(src, @"(?<=\""playstyle\"":\[[^\[\]]*\"")[^\"",]*(?=\"")");
    5. foreach(var m in matches)
    6. Console.WriteLine(m.ToString());
    7. Console.ReadKey();
    8. }
    C# Developer
    Learning C++

    Rikudo schrieb:

    Allerdings funktioniert die zweite Variante genauso nicht, selbiges problem ...
    Ja, ist mir dann auch aufgefallen, dass du ja auch die " escapen musst (was du ja richtig gemacht hattest).
    Daraufhin habich mein post nochmal neu editiert, und was du jetzt zitierst ist genau, was ich weg-editiert habe.
    Langer Rede kurzer Sinn: Lies das Thema nochmal im Zusammenhang richtig nach - So wirr, wie das jetzt hier erläutert ist, ist das Risiko, dass Missverständnisse verbleiben zu hoch für dieses wichtige Thema.