18 berichten aan het bekijken - 1 tot 18 (van in totaal 18)
  • Q:

    Bijdrager
    koen

    regex vraagje

    Deze string is de input:

    XX=value1 YY=value2 ZZ=value3

    De values kunnen uit meer dan een woord bestaan, en er kunnen ook getallen of ander characters inzitten. Dus splitsen op elke spatie is geen oplossing. Ik probeer de string op te splitsen in:

    XX=value1

    YY=value2

    ZZ=value3

    etc.

     

    Ik kan de keys er als volgt uithalen: ([A-Z][A-Z]=), maar dan heb ik de values nog niet.

    Wie weet raad?


    Bijdrager
    Glime

    Eerst een array maken door the splitten op de spatie

    Dan elke waarde in de array splitten op het = char

     

    C# voorbeeld:

    string input = “XX=value1 YY=value2 ZZ=value3″;

    string[] regels = input.Split(” “);

    foreach (string regel in regels)

    {

    string naam = regel.Split(“=”)[0];

    string waarde = regel.Split(“=”)[1];

    }

    • Deze reactie is gewijzigd 5 maanden geleden door  Glime.

    Bijdrager
    koen

    Ik kan niet splitsen op een spatie, omdat value uit meer dan één woord kan bestaan (staat al in de vraag 😉)


    Bijdrager
    spelbook

    Wat heb je allemaal al geprobeerd?


    Bijdrager
    koen

    Dat staat ook in de vraag. Verder kom ik niet.


    Bijdrager
    Glime

    Om mee te testen: https://dotnetfiddle.net/0ZwNuQ

    Ik heb in mn hoofd hoe het moet maar ik ga dat morgen proberen;)

     


    Bijdrager
    koen

    Tof, bedankt!

     

    XX kan ook AB zijn, maar altijd twee hoofdletters plus een gelijkteken. Als ik de XX=value groepen in een array kan krijgen, kan ik dan zelf wel de key en value er uit halen.


    Bijdrager
    Glime

    Het werkt;)

    https://dotnetfiddle.net/i6jXxe

     

    Heb het = teken gebruikt om ervoor de naam en erna de waarde eruit te vissen.

    • Deze reactie is gewijzigd 5 maanden geleden door  Glime.

    Bijdrager
    koen

    Dat is geen regex en ik gebruik geen C# 🤔. Het is voor ObjectiveC / Swift.

    Toch bedankt voor het meedenken. 👍

    • Deze reactie is gewijzigd 4 maanden, 4 weken geleden door  koen.

    Bijdrager
    spelbook

    <p class=”cite”>koen op 15 juli 2018 om 00:27</p>
    Dat staat ook in de vraag. Verder kom ik niet.

    Heb je al geprobeerd iets met .* te doen? En [^=]* enzo?

    Check ook bijvoorbeeld deze: https://regexr.com/


    Bijdrager
    koen

    @glime: maar het werkt, ik ga dat proberen om te zetten.

     

    @spelbook: ik ga er mee aan de slag, bedankt.


    Bijdrager
    koen

    Ok, na wat meer trial en error ben ik nu hier:

    ([A-Z]{2}=)[^[A-Z]+

    Dit werkt, maar alleen als er geen hoofdletters in de value staan.

    En:

    ([A-Z]{2}=)\w*

    Maar stopt bij de eerste spatie.

    Wie helpt me verder?

     

     


    Bijdrager
    Glime

    Als je dit “/([A-Z]{2})=([^\n\r=])*/i” in de regex gebruikt, hoek je alleen de parameter van de volgende eraf te halen.

    regexr.com/3ses6


    Bijdrager
    Jakko Westerbeke

    <p class=”cite”>koen op 15 juli 2018 om 00:09</p>
    Ik kan niet splitsen op een spatie, omdat value uit meer dan één woord kan bestaan (staat al in de vraag 😉)

    Splits op het =-teken (of mag dat ook in de waarde zitten?) en kap dan de laatste twee tekens van elke waarde.


    Bijdrager
    Shmoo

    Is het niet verstandiger om te kijken naar hoe die string met alle waardes tot stand komt? Volgens mij kun je daar beter het probleem aanpakken. Als dat user input zou zijn dan lijkt het mij juist verstandig om daar een systeem te maken zodat de user je waardes meteen goed aanlevert. Scheiden door komma’s of elke waarde op een nieuwe regel. Dat is allemaal veel eenvoudiger af te vangen en splitten.

     

    Of denk ik nu te simpel?

     


    Bijdrager
    koen

    OK, ik ga het anders aanpakken, ik gebruik mijn eerste regex, en vind zo de keys. Dan ik daar op zoeken in de input, en de ranges ertussen zijn de waardes.  Wat een gedoe:)

    Wel vreemd dat dit zo moeilijk op te lossen is met een regex. 🤔

     

    @shmoo: de input komt van buitenaf, en ligt helaas vast.

    @jakko-westerbeke: zou kunnen, de laatste twee characters zijn dan de key van de volgende. Ga ik naar kijken.

     

    Maar nu eerst de TdF en voetbal kijken.


    Bijdrager
    feek

    Dit komt al heel erg in de buurt:

    ([A-Z]{2})(\s*\=)((.(?![A-Z]{2}\s*\=))*)

    met als vervanging:

    $1$2$3$4\n


    Bijdrager
    koen

    Dat is ‘m. Reuze bedankt!

     

    Edit: die “\s*” zijn trouwens niet nodig. Ook de escape voor de ‘=’ kan weg. Dus uiteindelijk:

     

    ([A-Z]{2}=)((.(?![A-Z]{2}=))*)

    • Deze reactie is gewijzigd 4 maanden, 4 weken geleden door  koen.
    • Deze reactie is gewijzigd 4 maanden, 4 weken geleden door  koen.
18 berichten aan het bekijken - 1 tot 18 (van in totaal 18)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.