Я хочу показать только числа из строки.
Это мой вклад:
"aa[12]bb[34]cc[56]dd[78]"
Мой код до сих пор:
Dim total As String
total = TextBox1.Text
Dim istart As String
Dim iend As String
Dim first As String
Dim second As String
Dim third As String
Dim four As String
Dim icount As String
icount = Len(total)
Do While icount > 0
istart = total.IndexOf("[")
iend = total.IndexOf("]") '
If iend > 0 Then
first = total.Substring(istart + 1, iend - istart - 1)
MessageBox.Show(first)
second = total.Substring(iend + 1, icount - iend - 1)
MessageBox.Show(second)
third = second.Substring(istart + 1, iend - istart - 1)
MessageBox.Show(third)
Else
icount = 0
End If
Loop
Я ожидаю выхода
12
34
56
78
да пользователь всегда вводит этот тип ввода
И вы хотите, чтобы конечные числа были разделены пробелом? Итак, вы получите Двенадцать Тридцать Четыре Пятьдесят Шесть Семь-Восемь?
да или другой вариант, например, показать номер в окне сообщения
Меня вдохновил эта почта.
Private Function StackOverflowTest() As String
Dim x As String = "aa[12]bb[34]cc[56]dd[78]"
Dim FinalString As String = ""
Dim NumberFound As Boolean = False
For Each ch As Char In x.ToCharArray()
If Char.IsDigit(ch) Then
FinalString += ch
NumberFound = True
Else
If NumberFound Then FinalString += " "
NumberFound = False
End If
Next
FinalString = FinalString.Remove(FinalString.Length - 1, 1)
MsgBox(FinalString)
Return FinalString
End Function
Вот простой способ с Regex
:
Dim text As String = "aa[12]bb[34]cc[56]dd[78]"
Dim numbers As String() = _
Regex _
.Matches(text, "(\d+)") _
.Cast(Of Match)() _
.Select(Function(x) x.Value) _
.ToArray()
Или, если важны [
и ]
:
Dim numbers As String() = _
Regex _
.Matches(text, "\[(\d+)]") _
.Cast(Of Match)() _
.Select(Function(x) x.Groups(1).Value) _
.ToArray()
For Each number In numbers
Console.WriteLine(number)
Next
Вот что вы получаете:
12 34 56 78
Я думаю, важно, чтобы числа были в квадратных скобках, поэтому, возможно, что-то с немного другим регулярным выражением: String.Join(vbCrLf, Regex.Matches(s, "\[([0-9]+)]").Cast(Of Match).Select(Function(m) m.Groups(1).Value))
@AndrewMorton Я думаю, что автор изначально хотел, чтобы вывод был в виде одной строки, разделенной пробелами, а не возвратом каретки. Возможно, отредактировав исходный вопрос, вы изменили его волю. Но вы отлично поработали над переформатированием кода и поста в целом.
В исходном вопросе числа были в отдельных строках - они появлялись только в одной строке из-за того, что HTML сворачивал пробелы в один пробел. Из отдельных MessageBox.Shows я предполагаю, что отдельные строки должны были иллюстрировать несколько появлений диалога, поэтому, возможно, мне следовало разделить их еще больше. Во всяком случае, ОП, кажется, доволен тем, что они получили.
Другим подходом к такому форматированию может быть использование разрыва строки html <br>
, но блочные кавычки тоже работают. Хорошо поймал
Нелинковый способ. Не уверен, хотел ли он получить результат в виде строки или массива. Это создает строку.
Dim SourceString As String = "aa[12]bb[34]cc[56]dd[78]"
Dim FinalString As String = String.Empty
Dim Chars() = SourceString.Split("["c)
Dim SecondString = Join(Chars)
Dim NextChars() = SecondString.Split("]"c)
For Each Str As String In NextChars
FinalString &= System.Text.RegularExpressions.Regex.Replace(Str, "[^\d]", "") & Environment.NewLine
Next
Что там за Join
?
@Enigmativity Это похоже на Метод Microsoft.VisualBasic.Strings.Join, где необязательный второй параметр (строка соединения) по умолчанию равен пробелу.
@Enigmativity Извините, я не видел вашего комментария в своем почтовом ящике. Андрей прав. В этом случае это просто объединение всех элементов Chars()
обратно в строку, которая будет снова разделена на элементы NextChars()
, которые затем удаляют все неальфа-символы в For Each...
Ваши числа всегда в скобках, как это?