Letztes eingegebene Wort in RichTextBox als String auslesen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Letztes eingegebene Wort in RichTextBox als String auslesen

    Hi @all,

    ich möchte gerne das letzte Wort, bei dem der Cursor gerade steht, in einen String auslesen, habe aber keine Ahnung, wie ich das anstellen soll.
    Hoffentlich könnt ihr mir helfen :)

    Alex
    Hi!

    Habich aus einem älteren Projekt extrahiert, ist vmtl bischen Oversized, bin aber grad zu faul, es noch weiter zu verschlanken:

    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Public Class BiRegex
    3. Public Left As Regex, Right As Regex
    4. Protected Shared OptionForward As RegexOptions = RegexOptions.Multiline
    5. Protected Shared OptionBackward As RegexOptions = OptionForward Or RegexOptions.RightToLeft
    6. Public WriteOnly Property sLeft() As String
    7. Set(ByVal value As String)
    8. Left = New Regex(value, OptionBackward)
    9. End Set
    10. End Property
    11. Public WriteOnly Property sRight() As String
    12. Set(ByVal value As String)
    13. Right = New Regex(value, OptionForward)
    14. End Set
    15. End Property
    16. End Class


    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _WordFinder As New BiRegex With {.sLeft = "\b", .sRight = "\b"}
    3. Private Sub TestToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) _
    4. Handles TestToolStripMenuItem.Click
    5. With RichTextBox1
    6. Dim i = .SelectionStart
    7. Dim ii = New Integer() {_WordFinder.Left.Match(.Text, i).Index, _
    8. _WordFinder.Right.Match(.Text, i).Index}
    9. Dim s = .Text.Substring(ii(0), ii(1) - ii(0))
    10. MsgBox(s)
    11. End With
    12. End Sub
    13. End Class


    Der Witz ist halt, 2 Regexe zu erstellen, von denen einer mit Option.RightToLeft nach WortGrenze ("\b") sucht
    Das is totaler Overkill ^^
    Was genau gesucht werden soll weiß Ich nicht, ist es nun das letzte Wort des Strings, oder das Wort, bei dem der Cursor steht?

    Ich hab'S mal so verstanden, dass das letzte Wort gesucht wird:

    VB.NET-Quellcode

    1. 'Oben:
    2. Imports System.Text.RegularExpressions
    3. 'Und hier die Funktion dafür
    4. Public Function GetLastWord(Byval input_string As String) As String
    5. Dim last_word As String = RegEx.Match(input_string, "\b.*?$", RegExOptions.IgnoreCase).ToString
    6. Return last_word
    7. End Function



    Einfach Funktion aufrufen und den zu durchsuchenden Text übergeben. Wenn also beisp. das letzte Wort des Textes in der RichTextBox zurückgegeben werden soll, ist die Funktion wie folgt aufzurufen:

    VB.NET-Quellcode

    1. GetLastWord(RichTextBox1.Text)





    link_275
    Hello World
    RegEx ist elegante Lösung. Aber das Problem lässt sich auch auf "normalen" Weg lösen:

    VB.NET-Quellcode

    1. Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged
    2. With DirectCast(sender, RichTextBox)
    3. If .Text.Trim.Length > 0 Then
    4. Dim wörter() As String = .Text.Trim.Split(" "c)
    5. Label1.Text = "Letztes Wort: " & wörter(wörter.Length - 1)
    6. wörter = Nothing
    7. Else
    8. Label1.Text = "Nichts eingegeben"
    9. End If
    10. End With
    11. End Sub
    Hmm, kommt auf den Text an. Aber gut, allgemeiner geht's am allerbesten so:

    VB.NET-Quellcode

    1. 'Oben:
    2. Imports System.Text.RegularExpressions
    3. 'Und hier die Funktion dafür
    4. Public Function GetLastWord(Byval input_string As String) As String
    5. Dim last_word As String = RegEx.Match(input_string, "(\s|\b)[^\s]+$", RegExOptions.IgnoreCase).ToString
    6. Return last_word
    7. End Function




    link_275
    Hello World

    link_275 schrieb:

    Das is totaler Overkill ^^

    sagich ja.

    ist auch nicht gemacht fürs letzte wort im text, sondern fürs Wort an der cursorPosition.
    Und in mein Prog habe ich noch weitere BiRegexe, mit denen ich auch annere Strukturen als Wortgrenzen ausfische, und dann isses nicht so schlecht.
    Ich hab' ja ned gesagt dass es schlecht wäre, Ich will damit nur andeuten, dass es auch kürzer gehen würde, das ist alles ;)
    Deine Lösung ist auch gut, aber wie gesagt, weniger zu schreiben ist halt schon ziemlich bequem ;)


    link_275
    Hello World

    link_275 schrieb:

    Ich will damit nur andeuten, dass es auch kürzer gehen würde

    [klugs....]
    Wenn man schon dabei sind: Deine Funktion läss sich auch kürzer schreiben ;)

    VB.NET-Quellcode

    1. Public Function GetLastWord(Byval input_string As String) As String
    2. Return (RegEx.Match(input_string, "(\s|\b)[^\s]+$", RegExOptions.IgnoreCase).ToString )
    3. End Function

    [/klugs...]
    Hahaha, Haarspalter du ;) Ja daran hab' Ich auch gedacht, wollte aber trotzdem ne extra Variable, zur Veranschaulichung, weil Ich mir dachte, so wird es einem Einsteiger schneller klar was hier passiert.



    link_275
    Hello World
    das ist aber schneller :P:

    VB.NET-Quellcode

    1. Dim lastWord As String = RTF.Substring(Math.Max(RTF.Text.LastIndexOf(" "),RTF.Text.LastIndexOf(Environment.NewLine)))'evtl. den Index noch um eins erhöhen

    Gegebenenfalls noch ein paar andere Trennzeichen hinzufügen, aber ist sicher die performanteste und schönste Lösung :P
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---