RegEx Tutorial - Blutige Anfänger und Fortgeschrittene

    • VB.NET

    Es gibt 56 Antworten in diesem Thema. Der letzte Beitrag () ist von razzzer530i.

      Wow super einführung echt toll.

      Allerdings hätt ich ne dringende Frage weil ich einfach nicht verstehe wie ich Regex für folgendes Problem einsetzen kann:

      Beispiel:

      String mit Windows Pfad "C:\Program Files\Sizer\sizer.exe"

      Mein Programm besitzt eine fläche in der ich verschiedene "Filter" Angaben machen kann zb.:

      Filterliste (eine List(Of String) mit inhalt "Sizer" und/oder "sizer.exe" oder auch "Sizer*", "*Sizer" etc.

      Das '*' soll dabei wie bei Regex üblich, ein Platzhalter sein

      Jetzt möchte ich während mein programm alle Ordner und Dateien durchgeht genau diese Filter die mit dem Pfad übereinstimmen überspringen (Filtern).

      Meine Frage ist jetzt wie ein dafür sinnvolles pattern aussehen würde, denn der Filter setzt bei mir sogar ein wenn er nur einen passenden Buchstaben finde zb. wenn ich ein 'e' eingebe matcht er dies in diesem pfad als "success" (ist ja auch an einigen stellen im Pfad enthalten "C:\Program Files\Sizer\sizer.exe"

      Kann man dies eventuell nur realisieren, wenn der Pfad-String zuvor nach "\" gesplitet wird und dann die einzelnen stücke geprüft werden?

      Vielen Dank schonmal für die Hilfe
      ist ein echt kompetentes Forum in das ich mich da angemeldet habe *schleim* :P

      Peace
      Erown Fatality Johnson
      Moin,

      ich bekomme schon ziemlich zu Beginn des Tutorials Probleme. Ich habe also die erforderlichen Objekte eingefügt und der Quelltext entspricht auch dem, aus dem ersten Post, sprich:

      VB.NET-Quellcode

      1. Imports System.Text.RegularExpressions
      2. Public Class Form1
      3. Sub FilterExpr(ByVal FilterObject As String)
      4. Dim Results As New List(Of String) 'Res als List
      5. Dim Curr As String = ""
      6. ListBox1.Items.Clear() 'ListBox items leeren
      7. Dim MC As MatchCollection 'Deklariere MC als MatchCollection
      8. 'Je nachdem ob CheckBox1 gecheckt ist, wird Groß- und Kleinschreibung ignoriert oder auch nicht:
      9. If CheckBox1.Checked Then
      10. MC = Regex.Matches(RichTextBox1.Text, FilterObject, RegexOptions.IgnoreCase) 'Wenn gecheckt, wird sie ignoriert
      11. Else
      12. MC = Regex.Matches(RichTextBox1.Text, FilterObject, RegexOptions.None) 'andernfalls wird darauf geachtet
      13. End If
      14. For i As Integer = 0 To MC.Count - 1 'Schleife durchlaufen
      15. If Results.Contains(MC(i).Value) = False Then
      16. Curr = MC(i).Value.ToString
      17. ListBox1.Items.Add(Curr) 'Übereinstimmungen in der ListBox eintragen
      18. End If
      19. Next
      20. End Sub
      21. 'Dann in TextBox1_TextChanged:
      22. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
      23. If Not TextBox1.Text = "." And Not TextBox1.Text = " " And Not TextBox1.Text = "" Then
      24. FilterExpr(TextBox1.Text) 'Unsere Sub FilterExpr wird aufgerufen
      25. End If
      26. End Sub
      27. 'Und noch in RichTextBox1_TextChanged:
      28. Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
      29. RichTextBox1.TextChanged()
      30. FilterExpr(TextBox1.Text)
      31. End Sub
      32. End Class


      Allerdings wird nun in Zeile 32 ein Bezeichner erwartet und in Zeile 34 bekomme ich dann noch folgenden Fehler:

      "Public Event TextChanged(sender As Object, e As System.EventArgs)" ist ein Ereignis und kann nicht direkt aufgerufen werden. Verwenden Sie eine RaiseEvent-Anweisung, um ein Ereignis aufzurufen. C:\Users\Chris\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb

      Kann das daran liegen, dass ich mit VB 2010 arbeite und das Tutorial für 2008 ist oder wo liegt dort mein Fehler?
      Korrekt, also:

      Aus

      VB.NET-Quellcode

      1. Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
      2. RichTextBox1.TextChanged()
      3. FilterExpr(TextBox1.Text)
      4. End Sub


      mach

      VB.NET-Quellcode

      1. Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged()
      2. FilterExpr(TextBox1.Text)
      3. End Sub
      Hello World
      Hallo Leute,

      ich bekomme irgendwie Regex nicht hin, alles andere verstehe ich, da ich es ja auch alles lernen will, aber Regex ist eine sache, die nicht in meinen kopf reinkomt.. ;)
      könnt ihr mir dabei helfen?

      Ich muss folgenden Code aus einer Richtextbox auslesen..:

      Quelltext:
      <DIV style="DISPLAY: block" id=dl_link><A href="http://www.youtube-mp3.org/get?video_id=hB7mqvD7u-c&amp;h=96895e8ef8d193ebf65b2acb235f81a9"><B>Herunterladen</B></A> · <A onclick="showLinkBox(); return false;" href="http://www.youtube-mp3.org/#">Verlinke diese mp3</A></DIV>



      und ich brauche:
      hB7mqvD7u-c&amp;h=96895e8ef8d193ebf65b2acb235f81a9
      (wie oben auch markiert)

      wie muss ich jetzt vorgehen? Ich komm mit Regex irgendwie nicht klar..



      LG

      VB.NET-Quellcode

      1. video_id\=\"".*?\"">


      auch wenn nach dem video_id= kein anführungszeichen ist, bin ich sicher du hast dich verschrieben, denn ich denke da gehört eins hin.
      wenn du den teil nun gematcht hast, musst du mit regex.replace noch "video_id\=\""|\"">" mit "" ersetzen (also mit nichts ersetzen, damit das wegkommt)


      link275
      Hello World
      Hallo Link275,

      danke für deine antwort ;)

      ich habe es mal ausprobiert, mit folgendem quellcode:

      VB.NET-Quellcode

      1. Dim Exists As String = Regex.IsMatch(RichTextBox1.Text, "video_id\=\.*?\"">", RegexOptions.IgnoreCase)
      2. TextBox3.Text = Exists
      3. RichTextBox1.Text = Regex.Replace(RichTextBox1.Text, "video_id\=\""|\"">", "", RegexOptions.IgnoreCase)



      aber ich bekomme in textbox3.text immer "False" ausgegeben, was habe ich falsch gemacht?

      LG

      //nope, ich hab mich nicht verschrieben^^

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „MiesliRiegel“ ()

      RegEx.IsMatch ist doch ein Boolean, wie willst du den einem String zuweisen... ?!

      Dim Str As String = RegEx.Match(Str, Pattern, RegExOption)

      und VORHER abfragen ob der gesuchte ausdruck überhaupt vorkommt mit If RegEx.IsMatch.
      Komm das schaffst du doch ohne Snippet, oder?!

      link275
      Hello World
      Ich hoffe ich bin kein Grabschänder, aber es handelt sich um eine wichtige Ergänzung.

      Ich denke es gibt da einen kleinen Fehler.
      "?" findet bis zum ersten Vorkommen des nachstehenden Ausdruckes.

      Im Beispiel unten wird durch

      Quellcode

      1. ?"

      bis zum ersten Vorkommen eines " gesucht (Nach src=").
      Bilder
      • Unbenannt.png

        6,2 kB, 545×133, 475 mal angesehen
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils
      Hi,

      jupp, korrekt, da hatt' Ich tatsächlich einen Fehler. Ich hatte als ich den Satz geschrieben hab zwei Gedankengänge im Kopf, zum einen wird ja der vorangehende Ausdruck gematcht, bis der nachstehende das erste mal auftritt ;)


      Link :thumbup:
      Hello World
      Ist zwar nicht wirklich wichtig, aaaaaber.......

      %P% schrieb:

      Quellcode

      1. ### Internetadressen finden:
      2. (http\:\/\/|www.).*\.[a-z]{1-4}
      Das findet garantiert keine Internetadresse ^^:
      1. Das muss (wie du selber beschireben hast ;)) "{a,b}", nicht "{a-b}" heißen...
      2. Außerdem solltest du den Punkt nach dem "www" escapen, da man sonst auch Adressen wie "wwwgoogle.de" findet (das "g" wäre in diesem Fall das beliebige Zeichen, eingesetzt für einen nicht escapten Punkt).
      Was ich bei den ganzen Möglichkeiten nicht gesehen/verstanden habe:
      Wie muss der Patter aussehen, damit ich den Sendernamen bekomme, der zwischen zwei Buchstaben- bzw. Zeichengruppen steht?
      Beispiel:

      XML-Quellcode

      1. /></form></td><td>NDR 2</td><td>

      Ich hätte jetzt gerne den Namen des Senders (also NDR 2)
      Die Länge des Senders variiert natürlich
      Ich hoffe, das ihr es versteht und mir helfen könnt :D

      Danke
      Mit dem Pattern: (?<=<td>).*?(?=<\/td>) sollte es funktionieren. Das was vor und nach dem .*? kommt wird nicht gematcht.
      Stichwort "Assertions", suche auch nach positive und negative Lookaheads um Strings zu finden, nach oder vor denen ein oder nicht ein bestimmtes Suchmuster zutrifft. So kannst du z.B. das zwischen <td> und </td> finden ohne dass <td> und </td> gematcht wird.


      Link :thumbup:
      Hello World

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

      Wenn man wirklich alle URL finden möchte sollte man das nutzen:

      VB.NET-Quellcode

      1. Public Shared RegFindAllURL As String = "\b((https?|telnet|gopher|file|wais|ftp):[\w/#~:.?+=&%@!\-]+?)(?=[.:?\-]*(?:[^\w/#~:.?+=&%@!\-]|$))"


      Erklärung:

      VB.NET-Quellcode

      1. \b 'Beginne an Wortgrenze
      2. ( 'in $1 festhalten
      3. (https?|telnet|gopher|file|wais|ftp): ' Ressource und Doppelpunkt. Bei https ist ein ?, dass auch http gefunden wird, weil das s einmal oder keinmal da sein darf.
      4. [\w/#~:.?+=&%@!\-]+? 'ein oder mehrere gültige Zeichen aber so wenige wie möglich
      5. ) 'Ende $1
      6. (?= 'Ausschau halten nach
      7. [.:?\-]* 'Interpunktionszeichen
      8. (?:[^\w/#~:.?+=&%@!\-] 'ungültigen Zeichen
      9. |$) 'oder Ende des Strings
      10. ) 'Ende Ausschau halten

      Link275 schrieb:

      Mit dem Pattern: (?<=<td>).*?(?=<\/td>) sollte es funktionieren. Das was vor und nach dem .*? kommt wird nicht gematcht.
      Stichwort "Assertions", suche auch nach positive und negative Lookaheads um Strings zu finden, nach oder vor denen ein oder nicht ein bestimmtes Suchmuster zutrifft. So kannst du z.B. das zwischen und finden ohne dass und gematcht wird.


      Link :thumbup:
      (?<=<td>) ist aber Positives Lookbehind
      Es gibt Positives/Negatives Lookahead und Positives/Negatives Lookbehind

      VB.NET-Quellcode

      1. (?=...) 'positives lookahead = Blick nach vorne
      2. (?!...) 'negatives lookahead
      3. (?<=...) 'positives lookbehind = Blick nach hinten
      4. (?<!...) 'negatives lookbehind
      Lookahead und Lookbehind kommen in diesem Tutorial sowieso viel zu kurz (genau genommen gehört dieser Post nichtmal zum Tutorial). Es handelt sich hierbei aber natürlich auch um ein anfängerfreundliches Tutorial, weswegen ich verstehen kann, warum dies nicht mit hineingenommen wurde. Ich habe mir deswegen schon mal die Mühe gemacht, dafür ein separates Tutorial zu erstellen, in dem dies genau erklärt wird:
      [VB.NET] Lookahead und Lookbehind - Zwei unbekannte aber hilfreiche RegEx-Funktionen
      Kann ich jedem empfehlen, der sich viel und oft mit RegEx beschäftigt, man sollte aber dieses Tutorial hier vollkommen verstanden haben.
      @Artentus: Ja genau, ich hielt (und halte) es für keine gute Idee, in diesem (meinem) RegEx-Tutorial Assertions zu behandeln, es ist eben nur gedacht um einen ersten Eindruck und Überblick zu vermitteln, und mehr brauchen viele auch gar nicht. Ich selbst natürlich schon aber wenn man die Basics kennt und verstanden hat kann man sich alles weitere bei Bedarf selbst beibringen :)


      Link :thumbup:
      Hello World