Заменить несколько символов в строке в одной строке кода в VB.NET
Используя VB.NET, я хотел бы иметь возможность заменить ряд символов в строке в одной строке кода.
I.e., что-то вроде:
Dim charsToReplace as string = "acegi"
Dim stringToBeReplaced as string = "abcdefghijklmnop"
charsToReplace.ToArray().ForEach(Function (c) stringTobeReplaced = stringTobeReplaced.Replace(c, ""))
Однако это не работает.
Следующее работает, однако я не хочу, чтобы строка была переменной уровня класса:
Sub Main()
Dim toReplace As String = "acegikmoq"
Console.WriteLine(mainString)
Dim chars As List(Of Char) = toReplace.ToList()
chars.ForEach(AddressOf replaceVal)
Console.WriteLine(mainString)
Console.ReadLine()
End Sub
Dim mainString As String = "this is my string that has values in it that I am going to quickly replace all of..."
Sub replaceVal(ByVal c As Char)
mainString = mainString.Replace(c, "")
End Sub
Можно ли это сделать?
Ответы
Ответ 1
Если я прочитал это правильно, вы попытаетесь удалить список символов из строки. Это хорошо подходит для RegEx.
Console.WriteLine(Regex.Replace("abcdefghijklmnop", "[acegi]", string.Empty))
(вам нужно будет импортировать System.Text.RegularExpressions)
Ответ 2
Подход RegEx лучше всего подходит, но я действительно должен сказать:
Пожалуйста, ради любви к разработчикам технического обслуживания, не зацикливайтесь на том, чтобы получить это до 1 строки кода. Один вызов метода - ваша настоящая цель, если вы в итоге просто наваливаете кучу звонков в 1 строку, чтобы сказать, что это одна строка, тогда вы стреляете в ногу.
Ответ 3
Я не верил Bittercode, поскольку он сказал, что LINQ будет превосходить регулярное выражение.
Поэтому я сделал небольшой тест, чтобы быть уверенным.
Три примера того, как это сделать:
Dim _invalidChars As Char() = New Char() {"j"c, "a"c, "n"c}
Dim _textToStrip As String = "The quick brown fox jumps over the lazy dog"
Private Sub btnStripInvalidCharsLINQ_Click(sender As System.Object, e As System.EventArgs) Handles btnStripInvalidCharsLINQ.Click
Dim stripped As String = String.Empty
Dim sw As Stopwatch = Stopwatch.StartNew
For i As Integer = 0 To 10000
stripped = _textToStrip.Where(Function(c As Char) Not _invalidChars.Contains(c)).ToArray
Next
sw.Stop()
lblStripInvalidCharsLINQ.Text = _stripped & " - in " & sw.Elapsed.TotalMilliseconds & " ms"
End Sub
Private Sub btnStripInvalidCharsFOR_Click(sender As System.Object, e As System.EventArgs) Handles btnStripInvalidCharsFOR.Click
Dim stripped As String = String.Empty
Dim sw As Stopwatch = Stopwatch.StartNew
stripped = _textToStrip
For i As Integer = 0 To 10000
For Each c As Char In _invalidChars
stripped = stripped.Replace(c, "")
Next
Next
sw.Stop()
lblStipInvalidcharsFor.Text = stripped & " - in " & sw.Elapsed.TotalMilliseconds & " ms"
End Sub
Private Sub btnStripInvalidCharsREGEX_Click(sender As System.Object, e As System.EventArgs) Handles btnStripInvalidCharsREGEX.Click
Dim stripped As String = String.Empty
Dim sw As Stopwatch = Stopwatch.StartNew
For i As Integer = 0 To 10000
stripped = Regex.Replace(_textToStrip, "[" & New String(_invalidChars) & "]", String.Empty)
Next
sw.Stop()
lblStripInvalidCharsRegex.Text = stripped & " - in " & sw.Elapsed.TotalMilliseconds & " ms"
End Sub
Результаты:
![Performance results]()
Итак, цикл for с string.replace превосходит все другие методы.
Из-за этого я бы сделал функцию расширения для строкового объекта.
Module StringExtensions
<Extension()> _
Public Function ReplaceAll(ByVal InputValue As String, ByVal chars As Char(), replaceWith As Char) As String
Dim ret As String = String.Empty
For Each c As Char In chars
ret.Replace(c, replaceWith)
Next
Return ret
End Function
Затем вы можете использовать эту функцию красиво и легко в одной строке:
_textToStrip.ReplaceAll(_invalidChars, CChar(String.Empty))
Ответ 4
Класс String имеет способ замены для этого. Вы можете использовать его следующим образом:
YourString = YourString.Replace("OldValue", "NewValue")
Ответ 5
Я рекомендую подход Джона Гэллоуэя, регулярное выражение является подходящим методом, и будущие разработчики будут вам благодарны за это:) - хотя это и не сложная проблема для решения с Linq. Вот какой-то (непроверенный) код С# для этого:
string stringToBeReplaced = "abcdefghijklmnop";
string charsToReplace = "acegi";
stringToBeReplaced = new String(stringToBeReplaced.Where(c => !charsToReplace.Any(rc => c == rc)).ToArray());
Я подозреваю, что этот код, вероятно, будет работать немного лучше, чем эквивалент регулярного выражения, если проблема с производительностью.
Ответ 6
Каков наилучший способ повторить оператор строки, если вы действительно хотите использовать этот код:
Sub Main()
Dim myString As String = Nothing
Dim finalString As String = Nothing
Console.Write("Please enter a string: ") 'your free to put anything
myString = Console.ReadLine()
finalString = myString.Replace("0", "")
myString = finalString
finalString = myString.Replace("1", "")
myString = finalString
finalString = myString.Replace("2", "")
myString = finalString
finalString = myString.Replace("3", "")
myString = finalString
finalString = myString.Replace("4", "")
myString = finalString
finalString = myString.Replace("5", "")
myString = finalString
finalString = myString.Replace("6", "")
myString = finalString
finalString = myString.Replace("7", "")
myString = finalString
finalString = myString.Replace("8", "")
myString = finalString
finalString = myString.Replace("9", "")
Console.WriteLine(finalString)
Console.ReadLine()
End Sub
Например: если вы набрали: 012ALP456HA90BET678
, выход будет: ALPHABET
.
Ответ 7
Public Function SuperReplace(ByRef field As String, ByVal ReplaceString As String) As String
' Size this as big as you need... it is zero-based by default'
Dim ReplaceArray(4) As String
'Fill each element with the character you need to replace'
ReplaceArray(0) = "WARD NUMBER "
ReplaceArray(1) = "WN "
ReplaceArray(2) = "WARD NO "
ReplaceArray(3) = "WARD-"
ReplaceArray(4) = "WARD "
Dim i As Integer
For i = LBound(ReplaceArray) To UBound(ReplaceArray)
field = Replace(field, ReplaceArray(i), ReplaceString)
Next i
SuperReplace = field
End Function