web-dev-qa-db-fra.com

Remplacez plusieurs caractères d'une chaîne dans une ligne de code dans VB.NET

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?

12
hitch

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)

25
Jon Galloway

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:

Performance results

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))
6
JDC

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.

6
STW

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")
1
danish

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.

1
Bittercoder

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.

0
user1982529
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
0
Ashutosh