Bestimmte Zeichen aus einer Zeichenkette zählen

  • Allgemein

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Kangaroo.

    Bestimmte Zeichen aus einer Zeichenkette zählen

    Hallo zusammen,

    Ich habe ein kleines Problem in meinem Code, den ich ziemlich sicher beheben könnte wenn ich wüsste wie viel mal bestimmte Zeichen in einer Zeichenkette vorkommen. Nur habe ich keine Ahnung wie das geht und ob das überhaupt geht. Beim googlen wurde ich jedenfalls nicht fündig, oder verstand es nicht.

    Hier die Zeichenkette:

    VB.NET-Quellcode

    1. 4030\PD = 354.06\PE{\A1;\S^1;}= 352.14\PE{\A1;\S^2;}= 352.36\PA{\A1;\S^1;}= 352.03


    Hier muss ich feststellen wie viel mal "\P" vorkommt.

    Hat hier jemand eine Idee?

    Vielen Dank schonmal im Voraus =)


    p.s. Wusste nicht genau wohin das Thema gehört, aber denke schon eher zu den Grundlagen, sonst bitte verschieben. :)
    Du gehst deine Zeichenkette Zeichenweise in einer For Each Schleife durch und prüfst dabei auf das Vorkommen der Zeichenfolge \P.

    LG
    :thumbsup:

    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Public Class Form1
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Dim txt As String = "4030\PD = 354.06\PE{\A1;\S^1;}= 352.14\PE{\A1;\S^2;}= 352.36\PA{\A1;\S^1;}= 352.03"
    5. Dim M As MatchCollection = Regex.Matches(txt, "\\P")
    6. Dim AnzBackslashAndP = M.Count
    7. End Sub
    8. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das Einfache ist das Schwierige, das ich kann...
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    jvbsl schrieb:

    For Schleife ist performanter

    stimmt sogar, hier mal die Werte für 1 Million Iterationen:

    Quellcode

    1. Regex: 2.878ms for 1.000.000 iterations
    2. For..Each: 472ms for 1.000.000 iterations

    Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Public Class Form1
    3. Dim sw As New Stopwatch
    4. Dim iterations As Integer = 1000000
    5. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    6. Dim txt As String = "4030\PD = 354.06\PE{\A1;\S^1;}= 352.14\PE{\A1;\S^2;}= 352.36\PA{\A1;\S^1;}= 352.03"
    7. ' performace regex
    8. sw.Reset() : sw.Start()
    9. For i = 1 To iterations
    10. Dim m As MatchCollection = Regex.Matches(txt, "\\P")
    11. Dim AnzBackslashAndP = m.Count
    12. Next
    13. ' Messung für Regex ausgeben
    14. sw.Stop()
    15. Trace.WriteLine(String.Format("Regex: {0:N0}ms for {1:N0} iterations", sw.ElapsedMilliseconds, iterations))
    16. ' performance For..Each
    17. sw.Reset() : sw.Start()
    18. For i = 1 To iterations
    19. Dim count As Integer = 0
    20. For j As Integer = 0 To txt.Length - 1
    21. If j > 0 AndAlso txt(j) = "P"c AndAlso txt(j - 1) = "\"c Then count += 1
    22. Next
    23. Next i
    24. ' Messung für For .. Each ausgeben
    25. sw.Stop()
    26. Trace.WriteLine(String.Format("For..Each: {0:N0}ms for {1:N0} iterations", sw.ElapsedMilliseconds, iterations))
    27. End Sub
    28. End Class


    Interessanterweise aber nur wenn man an der Stelle txt(j) = "P"c mit Character vergleicht. Lässt man das "c" weg, vergleicht also mit einem String, so wird die Messung um das 10fache schlechter.

    Ich denke ich sollte langsam mal etwas arbeiten :rolleyes:
    gut habe es jetzt mit einer if schleife gemacht, da ich diese schon kenne.
    Nur, wie fragt man ob etwas enthalten ist und nicht ob es auch genau dieser Text ist?

    VB.NET-Quellcode

    1. if string = "" then
    überprüft ja den string ob er nicht leer ist?

    VB.NET-Quellcode

    1. if string <> "\P" then
    ist dies zum überprüfen ob \P enthalten ist?
    @Naibaf:
    String ist ein Schlüsselwort,

    VB.NET-Quellcode

    1. if string = "" then

    funktioniert also nicht.
    Wenn Du hier als Fragender Codeschniples postest, stelle doch bitte sicher, dass sie syntaktisch richtig sind:

    VB.NET-Quellcode

    1. if txt = "" then
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    du könntest einmal via stringname.substring arbeiten, oder die einzelnen chars abfragen via stringname(i) bzw. stringname(i+1)

    @kangaroo: dank dir hab ich in letzter zeit den drang bei allen möglichen algorithmen die zeit zu stoppen um zu sehen was schneller ist :D