Regex.Matches - nur x Elemente brauch ich

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    Regex.Matches - nur x Elemente brauch ich

    Hallo,

    Ich habe einen String der mir immer unterschiedlich viele Matches liefert.

    Jetzt habe ich einen Integerwert, der mir angibt wie viele Matches ich brauche.
    Beispiel Integer ist 4 , würde dann nur die Matches 0-3 brauchen.


    Wie kann ich Regex.Matches jetzt nur auf soviele Elemente anwenden, wie ich brauche?

    Weil, wenn ich z.B nur 3 Matches brauche, haut Regex.Matches mir direkt alle Matches des Strings in die Matchcollection

    Kann man das irgendwie hinbekommen, dass nur 3 geregxt werden?
    Versuch doch noch eine For...Next Schleife einzubauen, die dir nur die ersten 3 Ergebnisse liefert.

    MFG Andi2572

    Edit:

    Hier ein Beispiel wie ich so etwas lösen würde. Ich habe deinen Code nicht, also habe ich kurz eine Konsolenanwendung geschrieben:

    VB.NET-Quellcode

    1. Sub Main()
    2. For Zähler As Integer = -1 To 3
    3. Do Until Zähler = 3
    4. Zähler = Zähler + 1
    5. Console.Write("hallo" & vbCrLf)
    6. If Zähler = 3 Then Exit For
    7. Loop
    8. Next
    9. Console.ReadKey()
    10. End Sub

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

    Andi2572 schrieb:

    Versuch doch noch eine For...Next Schleife einzubauen, die dir nur die ersten 3 Ergebnisse liefert.

    Du bist ja lustig. Ich möchte ja eben nicht, mit einer Schleife matches durchlaufen.
    Regex soll nur x Sachen aus einem String regexen, damit "unnötige" Matches erst gar nicht in der Matchcollection auftauchen.
    Aber ich glaube das geht garnicht.
    Dann bearbeite die Matchcollection entsprechend...

    VB.NET-Quellcode

    1. Dim i = {4, 6, 8, 10, 12}
    2. Dim f = i.Take(3)
    3. MessageBox.Show(f.Count)
    4. For Each element In f
    5. MessageBox.Show(element)
    6. Next

    Dasselbe Prinzip lässt sich sicher auch auf das Regex-Ergebnis anwenden.
    BTW: ist es wirklich so ein Problem, dass noch mehr Ergebnisse vorhanden sind? Wenn ich im Supermarkt 2 Liter Milch brauche, stört's mich doch auch nicht, dass da noch 20 Liter stehen. Die bleiben einfach da, und basta. ;)

    der_Kurt schrieb:

    Dasselbe Prinzip lässt sich sicher auch auf das Regex-Ergebnis anwenden.
    BTW: ist es wirklich so ein Problem, dass noch mehr Ergebnisse vorhanden sind? Wenn ich im Supermarkt 2 Liter Milch brauche, stört's mich doch auch nicht, dass da noch 20 Liter stehen. Die bleiben einfach da, und basta.

    Das Problem ist aber, dass es zu lange dauert die 20 Liter milch in den Wagen einzuräumen um dann erst den eigentlichen Bedarf herausnehmen zu können.

    Es macht(finde ich) halt keinen Sinn, Regex durch einen mega langen String durchzujagen, aus dem 98% der Matches gar nicht hätten in die Matchcollection reingemusst,
    weil ich sie halt nicht benötige.

    Das Problem ist halt, dass man das Pattern nicht anders schreiben kann, sonst landen die Einträge, die ich brauche , nicht in der Collection.
    Die sehen halt alle gleich aus.



    Aber Danke für den Tipp, ich probiers mal.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Kevin Hombre“ ()

    Kevin Hombre schrieb:

    Es macht(finde ich) halt keinen Sinn, Regex durch einen mega langen String durchzujagen, aus dem 98% der Matches gar nicht hätten in die Matchcollection reingemusst,
    weil ich sie halt nicht benötige.

    Jo, dassis prinzipiell schon richtig.
    Mit Regex.Replace(String, MatchEvaluator, Integer) könnteman sogar einen Workaround treiben, bei dem nur die gewünschte Anzahl an Matches an den Matchevaluator geschickt wern.
    Ist aber nicht sicher, ob intern nicht doch erst sämtliche Matches gebildet werden.

    Vor allem stellt sowas eine performance-Optimierung dar, und derlei Optimierungen sind grundsätzlich böse (aber leider nicht ganz immer verzichtbar).
    Jdfs.
    1. solltemans Performance-Optimieren niemals anfangen, ohne dass ein konkretes Performance-Problem besteht
    2. und dann sollteman den Erfolg auch überprüfen

    Wohlgemerkt: Ich definiere Optimierung als eine Verbesserung der Performance auf Kosten von Wartbarkeit und Wiederverwendbarkeit von Code.

    Häufig kann man Code verbessern, wobei sowohl Performance als auch Wartbarkeit gewinnen, und das ist dann keine Optimierung in diesem Sinne, sondern halt gscheites Coden.

    gugge auch Rules Of Optimization, besonders die Jacksonsche Formulierung ;)
    msdn.microsoft.com/en-us/libra…larexpressions.match.aspx

    An instance of the Match class is returned by the Regex.Match method and represents the first pattern match in a string. Subsequent matches are represented by Match objects returned by the Match.NextMatch method. In addition, a MatchCollection object that consists of zero, one, or more Match objects is returned by the Regex.Matches method.


    Also Match und MatchNext statt Matches oder?