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

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
user13355633 20 Апр 2020 в 10:40

2 ответа

Лучший ответ

Вы можете использовать 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

Или, если хотите, можете использовать Функция String.Substring:

    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
Andrew Morton 20 Апр 2020 в 13:03

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

line.LastIndexOf("-") + 1

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

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

И если вы сделаете sb.Replace, он заменит его для всех версий строки, которые вы ранее добавили в построитель строк. Следовательно, было бы более целесообразно заменить его в 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

1
ADyson 20 Апр 2020 в 09:09