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?

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];

}

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

Wat heb je allemaal al geprobeerd?

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

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

Ik heb in mn hoofd hoe het moet maar ik ga dat morgen proberen :wink:

 

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.

Het werkt :wink:

https://dotnetfiddle.net/i6jXxe

 

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

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

Toch bedankt voor het meedenken. ?

<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/

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

 

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

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?

 

 

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

<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.

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?

 

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 :slight_smile:

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.

Dit komt al heel erg in de buurt:

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

met als vervanging:

$1$2$3$4\n

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}=))*)