C# Vraagje

Vragen die je boven niet kwijt kunt, kan je hier stellen.

Moderator: Moderators

Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13488
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Parsing vind ik niet zo interessant, in elk geval niet waar het op waarden aankomt.. da's weer voor een ander stukkie software...

Ik heb in elk geval dat boekje over RegEx besteld.. maar dat komt niet eerder dan vrijdag binnen... tot die tijd... ga ik niet meer zo zitten klooien in mijn code.. het is al rommelig genoeg, omdat dit maar een "probeerprojectje" op mijn Laptopje is.. en ik er wel weer serieus mee aan de slag ga als ik weer thuis kan wonen... ik heb vandaag kleine stukjes in huis gelopen zonder wandelstok... maar afwachten wat de fysio er van vindt morgen...

Het gaat er mij nu om.. dat ik een string met al dan niet een of meerdere spaties ervoor (FCTB voegt geen TABS in voor Indentatie, maar spaties.. ) in zijn geheel een bepaalde kleur kan geven.. ongeacht of er matches in voorkomen met andere textstyles.

Code: Selecteer alles

private void fastColoredTextBox1_AutoIndentNeeded(object sender, AutoIndentEventArgs e)
        {

            if (e.LineText.Contains("SUB"))
            {
                string currentline = e.LineText.Trim();
                if (currentline.Length > 3)
                {
                    if (currentline.Substring(0, 3) == "SUB")
                    {
                        e.ShiftNextLines = e.TabLength;
                        return;
                    }
                    if (e.LineText.Trim() == "ENDSUB")
                    {
                        e.Shift = -e.TabLength;
                        e.ShiftNextLines = -e.TabLength;
                        return;
                    }
                }
            }
            if (e.LineText.Contains("IF"))
            {
                string currentline = e.LineText.Trim();
                if (currentline.Length > 3)
                {
                    if (currentline.Substring(0, 2) == "IF")
                    {
                        e.ShiftNextLines = e.TabLength;
                        return;
                    }
                    if (e.LineText.Trim() == "ENDIF")
                    {
                        e.Shift = -e.TabLength;
                        e.ShiftNextLines = -e.TabLength;
                        return;
                    }
                }
            }
Op zich is het deel wat de Indentatie regelt niet moeilijker dan dit.
hfjbuis
Donateur
Berichten: 3075
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: C# Vraagje

Bericht door hfjbuis »

Een regel met het woordje SUB of IF er in kun je zoeken met:

Code: Selecteer alles

public const string RegexMaskValue =@"\A.*?(SUB|IF).*?\r\n;"
\A het begin van een regel
. een willekeurig karakter
* zoeken naar 0 of meer karakters
? zoek zo min mogelijk karakters
(SUB|IF) naar de woorden SUB of IF, | is of teken
\r\n zoeken tot aan het einde van de regel

EDIT

Code: Selecteer alles

public const string RegexMaskValue =@"\A.*?(SUB|IF).*?\z;"
Met de \z op het einde zoekt hij tot het einde van de string ongacht of die eindigt me cr,crlf o lf (denk ik)
There are only 2 limits, the sky and your imagination
MeMoRy
Berichten: 737
Lid geworden op: 17 okt 2022 09:40
Locatie: Utrecht

Re: C# Vraagje

Bericht door MeMoRy »

hfjbuis schreef: 13 feb 2023 16:34

Code: Selecteer alles

public const string RegexMaskValue =@"\A.*?(SUB|IF).*?\z;"
Met de \z op het einde zoekt hij tot het einde van de string ongacht of die eindigt me cr,crlf o lf (denk ik)
Als het goed is zou "$" genoegt moeten zijn om het einde van een regel aan te geven. Dat doen de meeste editors in ieder geval.
Op die zelfde manier wordt "^" gebruikt voor het begin van een regel.

\A en \Z worden ook niet altijd ondersteund. Javascript kan er bijv niets mee.
hfjbuis
Donateur
Berichten: 3075
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: C# Vraagje

Bericht door hfjbuis »

Met $ geef je (ook) het einde van de regel aan, maar alleen in multiline mode en dan wordt de line terminator niet in het zoekresultaat opgenomen.
Ik dacht dat C# standaard in multiline mode staat.
\z zoekt tot aan het einde van de string in alle modes en dan wordt de line terminator niet in het zoekresultaat opgenomen.

Er zijn veel verschillende mogelijkheden waarbij ik naar de werking (resultaat) vaak moet raden. Het zou dan ook (\r\n|\n\r|\r|\n) kunnen zijn om alle mogelijke combinaties te vangen. Maar het kan ook zijn dat de laatste regel geen crlf heeft. Dan zou het (\r\n|\n\r|\r|\n|\z) kunnen worden
There are only 2 limits, the sky and your imagination
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13488
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Een regel met het woordje SUB of IF er in kun je zoeken met:

Code: Selecteer alles

public const string RegexMaskValue =@"\A.*?(SUB|IF).*?\r\n;"
Dat is op zich wel een handige.. Ik kan dezelfde format:

Code: Selecteer alles

=@"\A.*?(Woord 1|Woord 2).*?\r\n;"

natuurlijk ook gebruiken om WHILE en ENDWHILE en dergelijke te filteren..

Eigenlijk komt het hier op neer:
SUB en GOSUB moet ie herkennen, als eerste "non-Whitespace" karakter op een regel.. dat wil zeggen.. als SUB en of GOSUB als eerste op een regel voorkomen, ongeacht het aantal spaties, dan moet ie em herkennen.. staat er wat anders voor dan Spaties, dan moet ie em negeren, want dan staat ie blijkbaar in een COMMENT.. en die moeten in een Donkergroene jas..en niet in het blauw

Het is nog steeds of ik naar een Brainfuck Listing zit te kijken... :lol:

Code: Selecteer alles

 ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
en Ja.. hier staat het programma "Hello World"
hfjbuis
Donateur
Berichten: 3075
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: C# Vraagje

Bericht door hfjbuis »

Zo herkent hij alles dat met 0 of meer white space karakters (\s) begint gevolgd door SUB of IF

Code: Selecteer alles

public const string RegexMaskValue =@"\A\s*?(SUB|IF).*?\r\n;"
Met een gewone spatie moet het een echte spatie zijn

Code: Selecteer alles

public const string RegexMaskValue =@"\A\ *?(SUB|IF).*?\r\n;"
\S staat voor non white space
\s staat voor white space
There are only 2 limits, the sky and your imagination
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13488
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Code: Selecteer alles

public Regex Startfold = new Regex(@"\bSUB\b");
Dat heb ik er nu instaan.. en ik vraag me af..

Code: Selecteer alles

@"\A\s*?(SUB|IF).*?\r\n;"
Moet dat nog tussen haakjes, en is die puntkomma deel van de RegEx of gewoon het eind van de regel?

Code: Selecteer alles

public Regex Startfold = new Regex(@"\A\s*?(SUB|IF).*?\r\n;")
ofwel.. gaat dit werken?
MeMoRy
Berichten: 737
Lid geworden op: 17 okt 2022 09:40
Locatie: Utrecht

Re: C# Vraagje

Bericht door MeMoRy »

Ben je al bekend met sites als https://regexr.com/? Daar kan je dingen ook gewoon uitproberen
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13488
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Ja.. daar ben ik bekend mee.. en Nee.. die werken niet.. zelfs als ik een voorbeeldje aangedragen door een Forumlid daarin plak, werkt het niet.. heb je dus gemiddeld gezien NIETS aan.. dan kun je beter een kleine applicatie bouwen en daarin je Regex testen.. daar word je een stuk wijzer van...
hfjbuis
Donateur
Berichten: 3075
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: C# Vraagje

Bericht door hfjbuis »

Arie Kabaalstra schreef: 13 feb 2023 20:13 Dat heb ik er nu instaan.. en ik vraag me af..
@"\A\s*?(SUB|IF).*?\r\n;"
Moet dat nog tussen haakjes, en is die puntkomma deel van de RegEx of gewoon het eind van de regel?
Nee, de ; is een type fout als gevolg van het knippen en plakken
Er hoeven geen haakjes meer bij

Code: Selecteer alles

public Regex Startfold = new Regex(@"\A\s*?(SUB|IF).*?\r\n");
Bovenstaande regel gaat wel werken (denk ik) als elke regel eindigd met crlf
There are only 2 limits, the sky and your imagination
MeMoRy
Berichten: 737
Lid geworden op: 17 okt 2022 09:40
Locatie: Utrecht

Re: C# Vraagje

Bericht door MeMoRy »

Arie Kabaalstra schreef: 13 feb 2023 20:47 Ja.. daar ben ik bekend mee.. en Nee.. die werken niet.. zelfs als ik een voorbeeldje aangedragen door een Forumlid daarin plak, werkt het niet.. heb je dus gemiddeld gezien NIETS aan.. dan kun je beter een kleine applicatie bouwen en daarin je Regex testen.. daar word je een stuk wijzer van...
Ah ja, ik zie het al. Die werkt dus standaard op basis van Javascript en zoals ik al eerder aankaartte herkend Javascript dus "\A" niet als het begin van de regel. Je kan rechtbovenin de modus op PCRE zetten. Dan worden \A en \Z weer herkend.

Alternatief: je kan in C# altijd een Regex aanmaken met RegexOptions.Multiline en dan kan je weer ^ en $ gebruiken
"(?m)" werkt ook, e.g.: "(?m)^.*?(SUB|IF).*?$", zie dit topic op Stack Overflow
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13488
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

MeMoRy schreef: 14 feb 2023 09:20 Alternatief: je kan in C# altijd een Regex aanmaken met RegexOptions.Multiline en dan kan je weer ^ en $ gebruiken
"(?m)" werkt ook, e.g.: "(?m)^.*?(SUB|IF).*?$", zie dit topic op Stack Overflow
Nou.. da's dus zo'n beetje wat ik gedaan heb.. mijn huidige project is eigenlijk niet meer of minder dan een RegEx Tester, maar dan ook zo dat ik meerdere RegEx naast elkaar kan testen.. als dat allemaal is, zoals ik het wil hebben, dan kopieer ik die code, en plemp het in het uiteindelijke project..
Daar komen dan ook de andere functies bij, zoals de functietoetsen, de dialogen, save en load, en dat soort dingen..
Momenteel ben ik toch nog aan het revalideren, dus heb ik nog wat tijd..of.. laat ik het zo stellen...op deze manier kan ik "aan het werk"

Ik ga even experiproberen met de Code die @hfjbuis gisteren aanleverde..even kijken wat dat doet..
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13488
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Afbeelding

Dat werkt.. nu ook even testen of het met een vergelijkbare RegEx ook werkt voor het opvouwen van de code.. nu werkt het ook wel.. maar wie zegt dat het ook in alle gevallen werkt.. de RegEx voor de Subroutine aanduiding werkt in elk geval ik kreeg vanmorgen bevestiging dat het boekje verstuurd is...maar eigenlijk moet ik nu gewoon eens testen wat de RegEx in mijn programmaatje precies doen, en dat eens in een ander documentje opslaan..

Merk ook dat de Indentatie ook automagisch gaat.. dus krijg je een nette indeling van je Code.. Net echt..
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13488
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Het enige wat er nu nog aan "Mankeert" is het gegeven dat ie de SUB en ENDSUB niet kleurt als je de tekst plakt... maar eens even zien of dat em zit in het al dan niet gebruiken van CRLF in het "moederprogramma" waar ik de tekst van copieer..
Plaats reactie