Member 11856456 Ответов: 1

Как выполнить поиск по строке и динамически заменить определенные слова?


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

вот мой код:

путь к текстовому файлу строка подключения
sql-соединение с использованием select * для заполнения таблицы datata(repdt)

For Each textpath As String In Files.FileNames

           RichTextBox1.Clear()

           Dim newline = String.Empty
           Dim regstr = String.Empty

           For I As Integer = 0 To repdt.Rows.Count - 1
               For Each line As String In File.ReadLines(textpath)
                   If line.Contains(repdt.Rows(I).Item("originaltext").ToString) Then
                       newline = line.Replace(repdt.Rows(I).Item("originaltext"), repdt.Rows(I).Item("replacementtext"))
                         regstr = String.Join(Environment.NewLine, line.Split(New Char() {ControlChars.Lf}, StringSplitOptions.RemoveEmptyEntries)).Replace(vbTab, "")

                       RichTextBox1.Text += newline + Environment.NewLine
                   End If
               Next
           Next



Я пытаюсь превратить это в библиотеку или текст для замены.

Что я уже пробовал:

Изначально я использовал это:

For Each textpath As String In Files.FileNames
           RichTextBox1.Clear()

           Dim regstr As String = String.Join(Environment.NewLine, System.IO.File.ReadAllText(textpath).Split(New Char() {ControlChars.Lf}, StringSplitOptions.RemoveEmptyEntries))

           Dim replacestr As String = regstr.Replace("text", "text").Replace("text", "text").Replace("text", "text"). 'etc

           RichTextBox1.Text = replacestr
       Next


однако это требует кодирования каждый раз, когда я хочу что-то заменить.

Ralf Meier

Откуда берутся детали для замены струн ?
Если вы хотите иметь библиотечный метод-как вы хотите сказать ему, что он должен делать ?

Member 11856456

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

Я просто не знаю, как сделать так, чтобы код выглядел так:
regstr.Replace("текст", "текст").Заменить("текст", "текст").Заменить("текст", "текст"). - и так далее

где он автоматически добавит .Replace("text", "text") для каждой записи datatable, которая соответствует.

Ralf Meier

Я понимаю...
Я предлагаю следующее : Вы создаете метод (функцию), которому даете исходную строку, а также замены (например, в виде списка или массива).
Внутри вашего метода вы ищете размер массива (его длину) , перебираете его и выполняете замену элемент за элементом.
Если вы создадите комбинированную команду, как в вашем примере кода (replacestr = regstr.Replace("text", "text").Заменить("текст", "текст").Replace("text", "text")) он также будет делать замены шаг за шагом (но в данном случае по заказу компилятора).

1 Ответов

Рейтинг:
4

Alek Massey

Вот мое мнение на этот счет.

For Each textpath As String In Files.FileNames

           RichTextBox1.Clear()

           Dim newline = String.Empty
           Dim regstr = String.Empty

           //Process each line in the file once
           For Each line As String In File.ReadLines(textpath)
              newline = line
              //apply each replacement rule to the result of the previous replacement rule
              For I As Integer = 0 To repdt.Rows.Count - 1
                  If newline.Contains(repdt.Rows(I).Item("originaltext").ToString) Then
                       newline = newline.Replace(repdt.Rows(I).Item("originaltext"), repdt.Rows(I).Item("replacementtext"))
                  
                  //hold over code?
                  //regstr = String.Join(Environment.NewLine, newline.Split(New Char() {ControlChars.Lf}, StringSplitOptions.RemoveEmptyEntries)).Replace(vbTab, "")


                   End If
               Next
               //remove linefeeds and tabs
               newline=newline.Replace(Environment.NewLine,"").Replace(vbTab, "")
               //after all rules, add final result to the textbox
               if newline.TrimEnd().Length>0 then
                   RichTextBox1.Text += newline + Environment.NewLine
               end if
           Next


Member 11856456

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

Alek Massey

Были ли ранее пустые строки в выходных данных вашего кода?

Member 11856456

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

Alek Massey

Я обновил свое решение. Спасибо, что представилась.

Member 11856456

Пожалуйста, еще раз спасибо.