AppendLine и замена - PullRequest
       31

AppendLine и замена

2 голосов
/ 20 апреля 2020

Я хочу получить вывод от

223-F456

до

223-F456

223-F456#

223-F4560

223-#456

Я сделал простой код для этого, но только добавление #, 0 в конце строк работает:

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim sb As New StringBuilder
        For Each line In TextBox1.Lines
            sb.AppendLine(line)
            sb.AppendLine(line & "#")
            sb.AppendLine(line & "0")
            sb.Replace(line.LastIndexOf("-") + 1, "#") -> this doesn't work 
        Next
        TextBox2.Text = sb.ToString

вывод:

223-F456

223-F456#

223-F4560

Буква не всегда "F": я хочу заменить первую букву после "-", а не "F", также некоторые сериалы могут иметь Буква «F» - это не то, что я хочу.

Простой серийный номер в магазине, но замена строки после «-» не работает и не показывает, любая помощь будет принята.

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Вы можете использовать String.Remove и String.Insert следующим образом:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim sb As New StringBuilder()

    For Each line In TextBox1.Lines
        sb.AppendLine(line)
        sb.AppendLine(line & "#")
        sb.AppendLine(line & "0")
        Dim replaceAt = line.LastIndexOf("-") + 1
        sb.AppendLine(line.Remove(replaceAt, 1).Insert(replaceAt, "#"))
    Next

    TextBox2.Text = sb.ToString()

End Sub

Или, если хотите, можете использовать строку .Substring function:

    sb.AppendLine(line.Substring(0, replaceAt) & "#" & line.Substring(replaceAt + 1))

Можно также использовать регулярное выражение для замены, я ожидаю, что кто-то другой мог бы придумать лучшее регулярное выражение, но это работает:

    Dim re As New Regex("(.*-)([^-])(.*)")
    For Each line In TextBox1.Lines
        ' ...
        sb.AppendLine(re.Replace(line, "$1#$3"))
1 голос
/ 20 апреля 2020

Проблема в том, что

line.LastIndexOf("-") + 1

вернет число (указывающее место в line, где он нашел последний - символ плюс один).

Но функция replace ожидает, что вы сообщите ей, какую строку вы хотите заменить. Вы хотите заменить F, а не число. (Ваш текущий код будет преобразован в sb.Replace(4, "#"), который явно не найдет 4 s для замены.)

И если вы сделаете sb.Replace, он заменит его для всех версий строка, которую вы ранее добавили в stringbuilder. Следовательно, было бы более разумно заменить его в line, а затем добавить измененную версию line в построитель строк.

sb.AppendLine(line.Replace("F", "#"))

Демонстрация в реальном времени: https://dotnetfiddle.net/5BZAUg


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

Если вам нужно заменить любой символ, следующий за -, а не F, вы можете сделать это, найдя индекс символа в line и затем удаляет символ с этим индексом и заменяет его другим, например,

Dim index = line.LastIndexOf("-") + 1
sb.AppendLine(line.Remove(index, 1).Insert(index, "#"))

Демо: https://dotnetfiddle.net/RTbiUG

...