Visual Basic текст поиска для строки, отображать результаты в правильном регистре

...databox.text (из приведенного ниже примера кода) содержит большой список комбинированных слов (доменных имен), ранее введенных в программу. Есть 1 на каждую строку. В этом примере это изначально выглядит так:

thepeople.com
truehistory.com
workhorse.com
whatever.com
neverchange.com
...

Следующий код ниже сохраняет текст внутри databox в tlistfiltered.txt, а затем ищет tlistfiltered.txt, чтобы извлечь все строки, содержащие любой из элементов в списке, "arr()", а затем заполняет listview(lv) результатами. Это работает просто отлично, но результаты выглядят так:

thepeople.com
truehistory.com
neverchange.com
...

но что мне нужно, так это "найденная строка" (из списка arr () для правильного случая, поэтому результат будет:

thePeople.com
trueHistory.com
neverChange.com

Вот код....

 Dim s As String = databox.Text
        File.WriteAllText(dloc & "tlistfiltered.txt", s)
        databox.Clear()

        Dim text2() As String = System.IO.File.ReadAllLines(dloc & "tlistfiltered.txt")

        Dim arr() As String = {"people", "history", "change"}
        For index1 = 0 To arr.GetUpperBound(0)

            Dim YesLines() As String = Array.FindAll(text2, Function(str As String)

                                                                Return str.Contains(arr(index1))

                                                            End Function).ToArray

            databox.Visible = True
            For index2 = 0 To YesLines.GetUpperBound(0)
                Dim match As String = (YesLines(index2)) & vbCrLf

                                   databox.AppendText(match)
            Next
        Next
        s = databox.Text
        File.WriteAllText(dloc & "tlistfilteredfinal.txt", s)
        databox.Clear()
        domains = (From line In File.ReadAllLines(dloc & "tlistfilteredfinal.txt") Select New ListViewItem(line.Split)).ToArray
        lv.Items.Clear()
        My.Computer.FileSystem.DeleteFile(dloc & "tlistfiltered.txt")
        My.Computer.FileSystem.DeleteFile(dloc & "tlistfilteredfinal.txt")
        BackgroundWorker1.RunWorkerAsync()
    End Sub

Есть ли способ сделать это на лету? Я пробовал StrConv и т. Д., Но он только конвертирует всю строку в соответствующий регистр. Я только хочу, чтобы "найденное" слово, содержащееся в строке, было преобразовано....

редактировать:

увидев ответ @soohoonigan, я отредактировал

      databox.Visible = True
        For index2 = 0 To YesLines.GetUpperBound(0)
            Dim match As String = (YesLines(index2)) & vbCrLf

                               databox.AppendText(match)
        Next
    Next

к этому:

databox.Visible = True
            For index2 = 0 To YesLines.GetUpperBound(0)
                Dim match As String = (YesLines(index2)) & vbCrLf
                Dim myTI As System.Globalization.TextInfo = New System.Globalization.CultureInfo("en-US", False).TextInfo
                If match.Contains(arr(index1)) Then
                    match = match.Replace(arr(index1), myTI.ToTitleCase(arr(index1)))
                    'StrConv(match, vbProperCase)
                    databox.AppendText(match)
                End If
            Next

и получил желаемый результат!

2 ответа

Решение

Открытый класс Form1

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim test As String = "thepeople.com"
    Dim search As String = "people"
    Dim myTI As System.Globalization.TextInfo = New System.Globalization.CultureInfo("en-US", False).TextInfo
    If test.Contains(search) Then
        test = test.Replace(search, myTI.ToTitleCase(search))
        MsgBox(test)
    End If
    Me.Close()
End Sub

Конечный класс

Я не уверен, что понимаю необходимость использования файлов для промежуточных шагов и удаления их в конце, например.

  • Первый шаг: получение строк ввода
    Это можно сделать с помощью Lines свойство базы данных (которую я подозреваю TextBox или же RichTextBox; если это не так, мы все еще можем использовать свойство Split on Text.

    Dim lines = databox.Lines ' or databox.Text.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
    
  • Второй шаг: мы хотим отфильтровать эти строки, чтобы оставить только те, которые содержат искомые тексты
    Для этого есть несколько способов, простым из которых будет использование запроса Linq для выполнения работы.
  • Третий шаг: преобразование результата фильтра, заменяющего искомый текст его заглавными буквами.
    Поэтому мы продолжаем начатый запрос и добавляем проекцию (или отображение) для выполнения преобразования.
    Нам нужно использовать TextInfo.ToTitleCase для этого.

    ' See soohoonigan answer if you need a different culture than the current one
    Dim textInfo = System.Globalization.CultureInfo.CurrentCulture.TextInfo
    
    Dim query = From word in arr
                From line in lines
                Where line.Contains(word)
                Let transformed = line.Replace(word, textInfo.ToTitleCase(word))
                select transformed
    ' We could omit the Let and do the Replace directly in the Select Clause
    
Другие вопросы по тегам