Avec VB.NET, j'aimerais pouvoir remplacer une plage de caractères dans une chaîne de caractères par une seule ligne de code.
C'est-à-dire quelque chose comme:
Dim charsToReplace as string = "acegi"
Dim stringToBeReplaced as string = "abcdefghijklmnop"
charsToReplace.ToArray().ForEach(Function (c) stringTobeReplaced = stringTobeReplaced.Replace(c, ""))
Cependant, cela ne fonctionne pas.
Ce qui suit fonctionne, mais je ne veux pas que la chaîne soit une variable de niveau de classe:
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
Cela peut-il être fait?
Si je lis ceci correctement, vous essayez de supprimer une liste de caractères d’une chaîne. Ceci est un bon moyen pour un RegEx.
Console.WriteLine(Regex.Replace("abcdefghijklmnop", "[acegi]", string.Empty))
(vous devrez importer System.Text.RegularExpressions)
Je ne croyais pas à Bittercode car il disait que LINQ surpasserait les expressions rationnelles. J'ai donc fait un petit test juste pour en être sûr.
Trois exemples de comment faire cela:
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
Les resultats:
Ainsi, la boucle for avec string.replace surperforme toutes les autres méthodes.
Pour cette raison, je créerais une fonction d'extension pour l'objet string.
Module StringExtensions
<Extension()> _
Public Function ReplaceAll(ByVal InputValue As String, ByVal chars As Char(), replaceWith As Char) As String
Dim ret As String = InputValue
For Each c As Char In chars
ret = ret.Replace(c, replaceWith)
Next
Return ret
End Function
Ensuite, vous pouvez utiliser cette fonction Nice et lisiblement sur une seule ligne:
_textToStrip.ReplaceAll(_invalidChars, CChar(String.Empty))
L’approche RegEx est la mieux adaptée, mais ce que j’ai vraiment besoin de dire, c’est:
S'il vous plaît, par amour pour les développeurs de maintenance, ne vous attardez pas pour en arriver à une ligne de code. Un objectif de méthode est votre objectif réel. Si vous finissez simplement par empiler un groupe d’appels sur une seule ligne pour indiquer qu’il s’agit d’une ligne, vous vous tirez une balle dans le pied.
La classe String a une méthode de remplacement pour le faire. Vous pouvez l'utiliser de cette façon:
YourString = YourString.Replace("OldValue", "NewValue")
Je recommande l'approche de Jon Galloway, une expression régulière est la méthode appropriée, et les futurs développeurs vous en remercieront :) - bien que ce ne soit pas un problème difficile à résoudre avec Linq également. Voici quelques codes (non testés) C # pour le faire:
string stringToBeReplaced = "abcdefghijklmnop";
string charsToReplace = "acegi";
stringToBeReplaced = new String(stringToBeReplaced.Where(c => !charsToReplace.Any(rc => c == rc)).ToArray());
Je soupçonne que ce code fonctionnera probablement un peu mieux que l’équivalent regex, si les performances posent problème.
Quelle est la meilleure façon de répéter l’instruction de ligne si vous voulez vraiment utiliser ce code:
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
Par exemple: si vous avez tapé: 012ALP456HA90BET678
, le résultat serait: ALPHABET
.
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