avatar
Today is Friday
October 18, 2019

Search Results Archives: January 2011

January 10, 2011

Assembly (DLL) naar broncode en obfuscation

by tsnoei — Categories: Uncategorized — No Comments - Afdrukken Afdrukken
Assembly naar broncode

Assembly naar broncode met de gratis .NET Reflector van Red Gate

Zou je graag eens een kijkje nemen in de code van een collegadeveloper maar heb je alleen de gecompileerde code? Red Gate heeft een prachtige tool waarmee zogenaamde code disassembler. Ofwel de tool, .NET reflector, bouwt assemblies terug naar sourcecode. Er is zowel een gratis als een betaalde versie beschikbaar.

Niet leuk?

Gebruik obfuscator software om je sourcecode zo onleesbaar te maken dat ook na disassembling onnavolgbare code onstaat. Een aantal pakketten die dit doen zijn o.a.:

  • CodeVeil
  • Dotfuscator
  • Deepsea
  • CryptoObfuscator
  • SmartAssembly
  • January 7, 2011

    Regex Deel 3 – De puntjes op de i

    by tsnoei — Categories: Uncategorized — No Comments - Afdrukken Afdrukken

    Zoals je in het vorig deel hebt kunnen lezen is de regular expression tester te gebruiken om je regex kennis te praktiseren en expressies uit te testen.

    Speciale karakters

    Begin van een woord matchen

    Het speciale karakter “\b” match een begin van een woord. Hebben we te doorzoeken tekst “Jan loopt met an in het bos met zijn os.” dan vinden we met de volgende reguliere expressie alleen een match op het woord “os”:

    \bos

    Een match op de naam “an” maar niet op “Jan” (in dit voorbeeld zonder hoofdletters) verkrijgen we door:

    \ban

    Om op elk woord een match te krijgen kan de volgende expressie worden gebruikt:

    \b\w+

    Match op alle karakters

    De “.” staat voor een match van alle karakters behalve row breaks en new line karakters:

    .+

    Bovenstaande matcht de volledige tekst. Overigens heeft de punt (“.”) binnen een karakterklasse (“[.]“) geen speciale betekenis.

    Carriage return, Line Feed en Tab

    Carriage return en Line Feed worden binnen regex hetzelfde aangeduidt als binnen .NET strings.
    De carriage return:

    \r

    De line feed:

    \n

    De tab:

    \t

    Bij het matchen van meerder regels binnen een tekst zijn de karakters van groot belang.

    Alternatieven (Alternation)

    Binnen karakterklassen wordt er gematcht op karakters binnen de klasse. Dit werkt altijd als een OF. Buiten de klassen wordt standaard als EN gematcht. Een OF match maken op “maandag” of “dinsdag” of “woensdag” gaat via de volgende reguliere expressie:

    (maandag|dinsdag|woensdag)

    De haken groeperen de opdracht. De pipes (“|”) zorgen voor de OF instructies.

    Case (in)sensitive

    (?i)

    Bovenstaande reguliere expressie maakt alles wat volgt case insensitive. De regulier expressie “(?i)jan” op de te doorzoeken tekst “Jan loopt in het bos” resulteert in een match op “Jan”.

    (?-i)

    Bovenstaande expressie heft case insensivity weer op.

    Gretig of lui repeteren

    Stel we hebben de tekst “Jan loopt in het bos. Hij speelt op zijn contrabas.” Als we elke zin willen matchen kunnen we de volgende reguliere expressie maken:

    [a-zA-Z\s]+

    Dit zal resulteren in 2 resultaten (gebruik tab 2 in de test tool). Dit is een voorbeeld van Greedy repetition. Het matchende resultaat wordt zo lang als mogelijk.
    Voegen we echter een “?” aan het speciale repetitiekarakter (“+”) dan schakelen we over naar lazy repetition:

    [a-zA-Z\s]+?

    Dit resulteert in 49 resultaten, voor elke letter en spatie 1 resultaat. Zodra er een match is is het afgelopen.

    Vooruit en achteruit kijken

    Het is mogelijk een match te maken op onderdelen in de tekst zonder ze mee te nemen in het resultaat. We hebben de tekst “Jan loopt in het bos.”. We willen een match op alles wat komt na de tekst “Jan”.

    (?<=Jan).*

    .* staat voor alle karakters. ?<=Jan is een lookbehind naar de tekst "Jan" zonder deze mee te nemen in het resultaat.
    Willen we een match op alles wat komt voor de tekst "bos" dan gebruiken we de volgende regex:

    .*(?=bos)

    Een combinatie van beide is:
    (?<=Jan).*(?=bos)
    Alles tussen "Jan" en "bos" wordt gematcht.

    Groeperen, verschillende resultaten in een keer matchen

    In de tekst: "12 december 2010 19:34:44.999" zouden we bijvoorbeeld de dag en maand + het uur en de minuten kunnen halen. Groepen met namen zijn hier de oplossing. Zo kunnen in een keer op verschillende onderdelen van de tekst matches accuraat worden opgehaald. Dit is vooral handig bij het gebruik in .NET code. Een voorbeeld volgt iets verderop in dit artikel.

    (?<DATUM>[1-9][0-9]{0,1}\s[a-zA-Z]+)\s[1-9][0-9]{3}\s(?<TIJD>[1-9][0-9]{0,1}:[0-9]{2}):[0-9]{2}[.][0-9]{3}

    De syntax:

    ?<GROEPNAAM>

    binnen de ronde haken zorgt voor naamgeving van een groep. In .NET bevat elke match een groepcollectie waarin de namen en resultaten zijn terug te vinden.

    Gebruik van reguliere expressies in .NET

    Zoals in de eerste deel van de regex artikelen aangegeven bevindt de regex functionaliteit zich binnen .NET in de System.Text.RegularExpressions namespace. De methode die vooral worden gebruikt voor het valideren en zoeken in de class Regex zijn:

  • IsMatch(string Text, string RegexPattern) resultaat Boolean
  • Matches(string Text, string RegexPattern) resultaat MatchCollection object
  • Belangrijk is om NIET te vergeten de patterns te escapen:

    ^\sbos.$

    Wordt in code:

    Regex.IsMatch("Jan loopt in het bos.", "\\sbos.$");

    Bij het gebruik van de Matches functie wordt een MatchCollection object geretourneerd. Dit is een collectie met alle gevonden matches (Match objecten). De gevonden frase kan worden terug in de value property van het Match object.

    MatchCollection AllMatches = Regex.Matches("Jan loopt in het bos.", "n");
    foreach (Match m in AllMatches)
    {
           string Frase = m.Value;
    }
    

    Zoals eerder genoemd kan het gebruik van groepsnamen heel handig zijn. In het derde tabblad van de regular expression tester kun je testen met groepen. Voorbeeld:

    string text = "12 december 2010 19:34:44.999";
    string regexPattern = "(?<DATUM>[1-9][0-9]{0,1}\\s[a-zA-Z]+)\\s[1-9][0-9]{3}\\s(?<TIJD>[1-9][0-9]{0,1}:[0-9]{2}):[0-9]{2}[.][0-9]{3}"
    MatchCollection Matches = Regex.Match(text, regexPattern); //er is 1 match
    int GroupCount = Matches[0].Groups.Count; //3 groepen, nl: 1. de gehele match, 2. Groep: DATUM en 3. Groep: TIJD)
    string Datum = Matches[0].Groups["DATUM"].Value; //of Matches[0].Groups[1].Value
    string Tijd = Matches[0].Groups["TIJD"].Value;
    
    Regular Expressions en groepen in .NET.

    Gebruik van het derde tabblad van de regular expression tester.

    Conclusie

    Er is nog veel meer te vertellen over regular expressions. Ik hoop dat dit helpt om een eind op weg te komen met regular expressions. Echt de puntjes op de spreekwoordelijke "i" ?. Onderstaand boek vond ik heel leerzaam, het behandeld ook de toepassing van reguliere expressies in .NET.

    Mastering Regular Expressions

    Mastering Regular Expressions


    Vragen of opmerkingen? Aarzel niet, elke reactie is van harte welkom!

    Regex Deel 2 – Quick start

    by tsnoei — Categories: Uncategorized — No Comments - Afdrukken Afdrukken

    snoei.net Regular Expression testerOm direct met de regels aan de slag te kunnen die we hieronder gaan bespreken is het handig de snoei.net Regex Tester silverlight applicatie te gebruiken. Denk nu vooral niet dat dit een hele spannende applicatie is. Het stelt weinig voor, net zoals het gebruik van reguliere expressies binnen het .NET framework.

    Door veel softwareontwikkelaars worden regular expressions gebruikt voor de validatie van velden zoals e-mailadres, url, postcode etc… Voor het zoeken van gegevens in grote stukken tekst wordt regex over het algemeen minder gebruikt. De manier waarop regex wordt gebruikt verschilt in beide gevallen niet veel van elkaar. Op beide zijn dezelfde regels van toepassing. We beginnen met de uitleg voor het doorzoeken van tekst. Het valideren van gegevens is dan appeltje/eitje.

    In de voorbeelden hieronder worden dubbele quotes (“) gebruikt om een bepaalde tekst, frase of regex aan te duiden. Neem deze dus niet mee in de tests.

    Hieronder overzichtelijk een aantal voorbeelden met een stuk tekst en een regular expression om bepaalde gegevens uit de tekst te halen.

    Voorbeelden

    ‘Gewone’ karakters (literals) gebruiken

    Tekst: “Jan loopt in het bos”
    Zoekopdracht: Komt het woord: “loopt” voor?
    Regex:

    "loopt"

    Uitleg: Voer dit bovenstaande voorbeeld in in op het eerste tabblad van de regular expression tester. Resultaat: een match. Het woord “loopt” komt tenminste 1 keer voor.
    Reguliere expressie tester voorbeeld

    Het gebruik van ^ en $

    Tekst: “Jan loopt in het bos.”
    Zoekopdracht: Bevat de zin exact “Jan loopt in het bos.”?
    Regex:

    "^Jan loopt in het bos.$"

    Uitleg: Het dakje (“^”) duidt aan dat de daaropvolgende tekst aan het begin van de te doorzoeken tekst moet staan. De reguliere expressie “^Jan” levert bijvoorbeeld een match op bij alle teksten die beginnen met “Jan”. Het dollar-teken (“$”) duidt het einde van de tekst aan. De regex “bos.$” levert een match op bij alle teksten die eindigen met “bos.”. Deze 2 in combinatie gebruiken betekent dat alles tussen deze 2-tekens exact overeen moet komen met de te doorzoeken tekst. Herkenbaar? Ja, deze worden bijna altijd samen gebruikt bij validaties.

    Omzeilen van speciale karakters
    ^ en $ zijn dus speciale karakters en geen literals. Als met speciale tekens toch als literals wil gebruiken. Stel je wil een match maken op een dollar teken. Plaats dan een “\” voor het speciale teken. Dus tekst: “$500,-”, regex: “\$500,-” geeft een match.

    Wat is een karakter klassen (character classes)

    Tekst: “Jan loopt in het bos. Hij speelt op zijn contrabas.”
    Zoekopdracht: De termen “bos” en “bas”.
    Regex:

    "b[oa]s"

    Uitleg: Gebruik voor deze test het tweede tabblad van de Regular Expression tester.

    Regular Expression tester - teksten doorzoeken

    Er zijn 2 resultaten, “bos” en “bas”. We maken gebruiken van de zogenaamde character classes. Character classes zijn verzamelingen van karakters die worden omsloten met rechte haken (“[" en "]“). Een karakter klasse definieert welke karakters mogen voorkomen op een bepaalde positie binnen de tekst. In dit geval mag “o” OF “a” voorkomen op een plek tussen “b” en “s”. Het wordt “boos”, “boas” of “baas” zal dus niet in de zoekresultaten voorkomen omdat het hier slechts om 1 positie gaat.

    Karakter klassen en karakterreeksen (a-z A-Z)

    Tekst: “Jan loopt in het bos. Hij speelt op zijn contrabas.”
    Zoekopdracht: Alle termen die beginnen met een “b” en eindigen op een “s” met daartussen 1 ander willekeurig karakter.
    Regex:

    "b[a-zA-Z]s"

    Uitleg: a-z duiden alle kleine letters in het alfabet aan. A-Z alle hoofdletters. “b[a-z]s” zou dus alleen resulteren in een match als er een kleine letter tussen de “b” en de “s” staan. Alle reeksen op een rij:

    a-z Kleine letters van “a” tot “z”. Mogelijke variatie: “a-f” = alle kleine letters van “a” tot en met “f”.
    A-Z Hoofdletters van “A” tot en met “Z”.
    0-9 Alle cijfers van “0″ tot en met “9″.
    \d Cijfers.
    \w Alle woord karakters (alle alfanumerieke karakters inclusief underscore “_”).

    Uitsluiten van karakters in een klasse

    Tekst: “Jan loopt in het bos. Hij speelt op zijn contrabas.”
    Zoekopdracht: Alle termen die beginnen met een “b” en eindigen op een “s” met daartussen 1 ander willekeurig karakter behalve de “a”.
    Regex:

    "b[^a]s"

    Uitleg: Het dakje (“^”) binnen een karakterklasse heeft een geheel andere betekenis als daarbuiten (begin van de te doorzoeken tekst). Met het dakje binnen een karakterklasse wordt een uitsluiting aangeduidt. Er is 1 resultaat: “bos”.

    Karakter klasse en herhaling

    Tekst: “Jan loopt in het bos. Hij speelt op zijn contrabas.”
    Zoekopdracht: Alle termen die beginnen met een “l” en eindigen op een “pt” met daartussen een willekeurig aantal karakters.
    Regex;

    "l[o]+pt"

    Uitleg:Direct achter een karakter klasse kan een herhaling worden aangeduid. “+” staat voor 1 of meer. In dit geval matcht “loopt” omdat tussen “l” en “pt” 1 of meerdere o’s voorkomen.

    + 1 of meer
    * 0 of meer
    {x} (vb. {3}) x aantal keer zoals aangeduid. (vb. 3 keer)
    {x,y} (vb. {1,3}) x tot y keer. (vb. 1 tot 3 keer)
    \w Alle woord karakters (alle alfanumerieke karakters inclusief underscore “_”).

    Conclusie

    Een hoop informatie. Met deze informatie zou je al behoorlijk uit de voeten moeten kunnen met regulier expressies. In het 3de een laatste deel de puntjes op de i met betrekking tot reguliere expressies.

    In deel 3:

  • Alternation
  • Ankers (Anchors)
  • Special Characters
  • Reguliere expressies in .NET
  • Groeperen
  • Heb je vragen? Stuur een reactie.

    Regex Deel 1 – Wat zijn Regular Expressions?

    by tsnoei — Categories: Uncategorized — No Comments - Afdrukken Afdrukken

    Regular Expressions, Wikipedia zegt er het volgende over:

    Een reguliere expressie (afgekort tot “regexp”, “regex” of RE) is een manier om patronen te beschrijven waarmee een computer tekst kan herkennen. Er bestaat hiervoor een formele syntaxis, die grotendeels gestandaardiseerd is.

    Kortom regular expressions zijn een krachtige manier om teksten te doorzoeken. Iets om niet zomaar naast je neer te leggen. Een krachtiger taal om tekst te doorzoeken is er bijna niet. Regex worden veel gebruikt voor de validatie van datainvoer zoals het verifiëren van e-mail invoer, numerieke invoer, datums (data ;-) ) etc…

    Wat ik persoonlijk de moeilijkheid aan regex vond is het onthouden van de regels die erbij horen. Regex is typisch iets wat je in vlagen gebruikt. Zit er een wat langere tijd tussen het toepassen ervan dan zakt alle kennis weer weg. In eerste instantie lijken regular expressions behoorlijk ingewikkeld. Dat dat best meevalt zul je kunnen lezen in de rest van de serie.

    Het mooie is dat regex ook in Microsoft .NET goed wordt ondersteund. De regex functionaliteit is terug te vinden in de namespace System.Text.RegularExpressions.

    Een goed startpunt is de .NET regular expressions testapplicatie. In deel 2 aandacht voor het het onder de knie krijgen van de regels met behulp van de Snoei.net Regex Tester. Deze Silverlight testapplicatie is een handig hulpmiddel voor mensen die minder van lezen houden en meer van ‘hands-on’ oplossingen.

    C# codevoorbeeld:

    using System.Text.RegularExpressions;
    
    public void Test()
    {
    	string Value = "12345";
    	string RegexPattern = "^[0-9]{5}$"
    	bool Match = Regex.IsMatch(Value, RegexPattern); //Match = true;
    }
    © 2019 Snoei's .NET blog All rights reserved - Wallow theme v0.44 by ([][]) TwoBeers - Powered by WordPress - Have fun!