RegEx- Mini Tuturial

    • VB.NET

    Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von timi257.

      RegEx- Mini Tuturial

      Hallo,

      da hier im Forum sehr oft nach Highlighten und auslesen von bestimmten teilen eines Textes gefragt wird, habe ich mich entschlossen ein kleiens Tuturial zu schreiben.


      Highlighten:

      Wir müssen natürlich erst einmal RegEx importieren. Das machen wir so:

      VB.NET-Quellcode

      1. Imports System.Text.RegularExpression


      Jetzt kommt der eigentlich Code:

      VB.NET-Quellcode

      1. Dim Reg As System.Text.RegularExpressions.MatchCollection 'RegularExpression deklarieren
      2. Dim Match As System.Text.RegularExpressions.Match 'Match = Treefer (übereinstimmung)
      3. Dim pattern As String = "Test" 'Das Wort nachdem gesucht wird(groß & kleinschreibung ist egal). In diesem Fall wäre es "Test"
      4. Reg = System.Text.RegularExpressions.Regex.Matches(LCase(RichTextBox1.Text), LCase(pattern)) 'Das erste LCase gibt an wo der Text steht der durchsucht werden soll (in diesem Fall: RichTextBox1 und das zwiete LCase gibt an wonach gesucht werden soll. In diesem Fall nach "pattern" (pattern wurde der Wert "Test" zugewiesen)
      5. For Each Match In Reg 'Für jeden treffer mach das
      6. RichTextBox1.Select(Match.Index, Match.Length) 'Text markieren. Index ist die angabe, an welcher stelle das gesuchte wort steht und lenght ist logischerweise die länge des treffers
      7. RichTextBox1.SelectionColor = Color.Blue ' Farbe des selektierten Textes festplegen
      8. Next



      Dieser Code würde auch den text färben , wenn mitten in dem wort "Test" vorkommt. Also würde aus großertest großertest.
      Wer das nicht beabsichtigt kann anstatt pattern den wert "Test" zu zuweisen einfach den wert "\sTest\s" benutzen. Das "\s" bedeutet, dass vor dem wort nichts stehen darf also eine leerzeile sein muss.


      Gehen wir davon aus, das wir einen Highlighter für Visual Basic bauen möchten also brauchen wir auch noch diese Funktion

      VB.NET-Quellcode

      1. 'nach diesem " ' " zeichen grün schreiben


      Das Funktioniert fast genauso wie das Highlighten von einzelnen wörtern:

      VB.NET-Quellcode

      1. Dim Reg As System.Text.RegularExpressions.MatchCollection
      2. Dim Match As System.Text.RegularExpressions.Match
      3. Dim pattern As String = "'.*" ' Hier steht das .* für jedes x beliebige zeichen. Also wird alles hinter dem ' markiert, wenn es sich in der selben Zeile befindet
      4. Reg = Regex.Matches(LCase(RichTextBox1.Text), LCase(pattern))
      5. For Each Match In Reg
      6. RichTextBox1.Select(Match.Index , Match.Length)
      7. RichTextBox1.SelectionColor = Color.Green
      8. Next





      Sachen aus einem Text auslesen:

      Das sieht am anfang meistens etwas komplizierter aus als es eigentlich ist. Wir gehen jetzt davon aus, dass wir einen Quelltext haben, der einen Interpreten,Titel und eine Tanzart enthält. Der Code ist dieser:

      PHP-Quellcode

      1. return false;"><td class='det_content' style='white-space:nowrap;'>Coldplay</td><td class='det_content'>Viva la Vida</td>
      2. <td class='det_content' style='white-space:nowrap;font-size:11px;'><img src='/images/n_4.gif' alt='4' title='gut tanzbar' /> Cha Cha Cha / <img src='/images/n_3.gif' alt='3' title='normal tanzbar' /> Disco Fox</td>


      In diesem Beispiel ist der Interpret Coldplay, der Titel Viva la Vida und die Tanzart ist Cha Cha Cha. Wir gehen jetzt davon aus, dass wir davon nichts wissen und nur den Quelltext haben ohne Interpreten,Titel und Tanzart. Außerdem befindet sich der Text in RichTextBox1(ist eigentlich egal dient auch nur als beispiel)

      Jetzt wollen wir zuerst den Interpreten(Coldplay) auslesen:

      VB.NET-Quellcode

      1. Dim interpretRegEx As New Regex("return false\;\""\>\<td class=\'det_content\' style=\'white-space:nowrap\;\'\>(?<interpret>(.*))\<\/td\>\<td class=\'det_content\'\>") 'erläuterung am unten dem Code ;-)
      2. Dim interpret As String = interpretRegEx.Match(RichTextBox1.Text).Groups("interpret").ToString


      Erläuterung:
      in den klammern finden wir sehr viele "\" diese Zeichen muss man in diesem Fall nicht setzen, aber in manch anderen schon und deswegen habe ich sie auch benutzt. Das Zeichen "\" ist auch nur dafür da, damit das Programm weiß, dass das zeichen kein Befehl ist sondern ein String(Zeichen). Bei RegEx gibt es nämlich Befehle, die aus solchen Zeichen bestehen, und damit sie nicht als solche erkannt werden muss man sie mit einem "\" escapen.

      In dem Code befindet sich auch noch das : "(?<interpret>(.*))"
      Das (?<interpret>) steht sozusagen für so etwas wie eine Variable (einen String). An dieses Stelle wird der Text in die Gruppe (so nennt man das bei RegEx) gespeichert und man kann diesen Inhalt dann mit diesem Code auslesen.

      VB.NET-Quellcode

      1. RegEx.match(RichTextBox1.Groups("gruppen name(in diesem fall interpret").ToStirng


      Hinter "(?<interpret>)" befindet sich auch noch ein "(.*)". Diese Zeichenkombination, steht für jedes x beliebiges Zeichen. An dieser Stelle würde normaler weise der Interpret stehen, aber da wir nicht wissen was an dieser Stelle steht, sagen wir dem Programm mit "(.*)", dass dort irgend etwas stehen muss das aber nicht bekannt ist.


      Auf diese gleiche Art und weise kann man natürlich auch den Titel und die Tanzart auslesen. Da es fast genau das gleiche ist , werde ich hier einfach den Code schreiben.

      Titel:

      VB.NET-Quellcode

      1. Dim titleRegEx As New Regex("\<\/td\>\<td class=\'det_content\'\>(?<Titel>(.*))\<\/td\>\<td class=\'det_content\' style=\'white-space:nowrap\;font-size:11px\;\'\>")
      2. Dim titel As String = titleRegEx.Match(RichTextBox1.Text).Groups("titel").ToString


      Tanzart:

      VB.NET-Quellcode

      1. Dim GenreRegEx As New Regex("\> (?<genre>(.*))\<\/td\>\<td class=\'det_content\' style=\'white-space:nowrap\;\'\>")
      2. Dim genre As String = GenreRegEx.Match(RichTextBox1.Text).Groups("string").ToString



      Hier ein paar Befehle für RegEx(für den wert in klammern):

      . = Steht für Jedes Zeichen aus für eine neue Zeile
      \w = Steht für jedes alphanummerisches Zeichen
      \s = Steht für ein Zeichen mit einem folgendem/vorangehendem Leerzeichen
      \d = Steht für jede Ziffer
      \b = Steht für den Anfang oder das Ende eines Wortes
      ^ = Steht für den anfang einen Stirngs
      $ = Steht für das ende eines Strings
      * = Wiederholt ein Zeichen beliebig oft
      + = Wiederholt das Zeichen ein oder mehr mals
      ? = Wiederholt das Zeichen 0 oder 1 mal
      {x} = Wiederholt das Zeichen x mal, wobei x für eine beliebige Zahl steht
      {x,y} = Wiederhotl das Zeichen mindestens x mal aber nicht öfter als y mal, wobei auch hier x und y für beliebige Zahlen stehen
      \W = Steht für alle Zeichen die NICHT alphanummerisch sind
      \S = Steht für jedes Zeichen ohne ein Leerzeichen davor oder dahinter
      \D = Steht für jedes Zeichen das keine Ziffer ist
      \B = Steht für eine Position die nicht der Anfang oder das Ende des Wortes ist
      [^x] = Kann für jedes Zeichen stehen außer x,wobei auch hier wieder x für eine beliebige Zahl steht
      [^abcd] = Kann für jedes Zeichen stehen, außer für a,b,c und d
      (Text) = Speichert den String, in diesem Fall "Text" in einer automatisch nummerrierten Gruppe
      (?<name>) = Speichert einen String in der Gruppe "namen" (namen ist nur ein Beispiel)



      Wer jetzt immer noch nicht genug hat, oder noch etwas unklar ist, der kann entweder seine Frage hier posten oder sich nochmal diese Seiten angucken:

      Tuturial von Dodo
      30 Minuten Tuturial (auf englisch)



      Ich hoffe ich konnte euch helfen.


      Grüße,

      viperkill

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

      Deine Zeile:

      VB.NET-Quellcode

      1. Reg = Regex.Matches(LCase(RichTextBox1.Text), LCase(pattern)) 'Das erste LCase gibt an wo der Text steht der durchsucht werden soll (in diesem Fall: RichTextBox1 und das zwiete LCase gibt an wonach gesucht werden soll. In diesem Fall nach "pattern" (pattern wurde der Wert "Test" zugewiesen)

      muss so lauten:

      VB.NET-Quellcode

      1. Reg = System.Text.RegularExpressions.Regex.Matches(LCase(RichTextBox1.Text), LCase(pattern)) 'Das erste LCase gibt an wo der Text steht der durchsucht werden soll (in diesem Fall: RichTextBox1 und das zwiete LCase gibt an wonach gesucht werden soll. In diesem Fall nach "pattern" (pattern wurde der Wert "Test" zugewiesen)

      Sonst gibt's einen Fehler!

      Gruß,
      Peter
      Hallo Confix,

      was bekommst du denn für einen fehler ?

      du solltest es vielleicht mal so versuchen:

      VB.NET-Quellcode

      1. \<\meta name=\""\keywords\""\ content=\""\(?string(.*))\\""\\>



      habe da einfach ein "(.*)" hingemacht, da du ja nicht weißt was da steht. Der "." Steht in diesem Fall für ein x belibiges Zeichen und das "*" sagt dem Programm, dass dieser Stirng solang sein kann wie er will. Wenn das "*" dort nicht stehen würde, würde das Programm denken der String darf nur 1 Zeichen lang sein aber wenn man ein "*" macht dann weiß das programm, dass der String unentlich lang sein kann.


      Grüße,

      viperkill

      viperkill schrieb:


      VB.NET-Quellcode

      1. \<\meta name=\""\keywords\""\ content=\""\(?string(.*))\\""\\>



      Wie Dragonsam schon sagt sind da nen paar \ zu viele drin. \ reicht vor den <> und wenn du noch extrazeichen (z.B. eigtl. Regexzeichen und /) hast. Ein " braucht nur zu nem "" werden.

      VB.NET-Quellcode

      1. \<meta name=""keywords"" content=""(?string(.*)""\>
      Ich hätte noch ne Frage:
      was ist denn an diesem Code Falsch:? :huh:

      VB.NET-Quellcode

      1. Dim hRegEx As New Regex("game.php?village=(?<string>([^""]+))""&amp;screen")
      2. Dim village As String = hRegEx.Match(Dein_Text).Groups("string").ToString()


      Ich will aus

      PHP-Quellcode

      1. /game.php?village=213316&amp;screen=main&amp;action=build&amp;id=main&amp;h=abd7

      213316 auslesen.
      Probiers mal mit:

      VB.NET-Quellcode

      1. Dim hRegEx As New Regex("game.php?village=(?<string>(.*))&amp;screen")
      2. Dim village As String = hRegEx.Match(Dein_Text).Groups("string").ToString()

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