2009-08-26 13 views
11

Utilizzo di VB.NET Mi piacerebbe essere in grado di sostituire un intervallo di caratteri in una stringa in una singola riga di codice.Sostituisci più caratteri nella stringa in una riga di codice in VB.NET

cioè qualcosa come:

Dim charsToReplace as string = "acegi" 
Dim stringToBeReplaced as string = "abcdefghijklmnop" 

charsToReplace.ToArray().ForEach(Function (c) stringTobeReplaced = stringTobeReplaced.Replace(c, "")) 

Tuttavia, questo non funziona.

Il seguente funziona, però non voglio la stringa da una variabile di livello di 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 

si può fare?

+0

Questo è un caso di "dovrebbe avere chiesto la domanda esatta invece di riformularlo". Per elaborare, in realtà ho una stringa che è fondamentalmente una serie di parole, separate da spazi. Ho una serie di parole che voglio eliminare dalla stringa, quindi perché ho pensato che il foreach sarebbe stato possibile/utile. Quando la (diversa) domanda viene posta in questo modo, Regex non è adatto. quindi in pratica: dim words() come stringa = ("the", "brown", "pigro") dim frase come stringa = "il rapido brown fox jump" results = "quick fox jumps" la mia speranza era per words.ForEach (Function (w) sentence.Replace (w, "") – hitch

risposta

1

La classe String ha un metodo di sostituzione per eseguire questa operazione. È possibile utilizzare in questo modo:

YourString = YourString.Replace("OldValue", "NewValue") 
+0

Potrei non essere stato completamente chiaro, ma voglio sostituire ogni istanza di ogni carattere nella stringa. ie chars = "asso" longString = "abcdeabcdeabcde" risultato = "bdbdbd" sostituzione non è in grado di fare questo – hitch

+0

si può effettivamente utilizzare Sostituire più di una volta la stessa dichiarazione:.. myDate2 = Date.Now.ToString ("s") Sostituire (":", "-"). Sostituisci ("T", "") –

24

Se ho letto correttamente, si sta cercando di spogliare un elenco di caratteri da una stringa. Questa è una buona misura per una RegEx.

Console.WriteLine(Regex.Replace("abcdefghijklmnop", "[acegi]", string.Empty)) 

(avrete bisogno di importare System.Text.RegularExpressions)

+0

e le prestazioni di tale metodo, se usate molto spesso? – serhio

+0

@serhio: Regex è, infatti, creato per la manipolazione delle stringhe. Qualsiasi altra cosa tu usi per gestire la stringa, regex lo fa molto più velocemente e usa meno risorse. –

+0

@ SimonDugré come mostrato nella mia risposta (che era precedente al tuo commento) è il contrario. Regex è molto più lento. – JDC

1

raccomando l'approccio di Jon Galloway, un espressione regolare è il metodo appropriato, e gli sviluppatori futuri vi ringrazierà per esso :) - anche se non è un problema difficile da risolvere anche con Linq. Ecco alcuni (non testato) codice C# per farlo:

string stringToBeReplaced = "abcdefghijklmnop"; 
string charsToReplace = "acegi"; 
stringToBeReplaced = new String(stringToBeReplaced.Where(c => !charsToReplace.Any(rc => c == rc)).ToArray()); 

Ho il sospetto che questo codice sarà probabilmente eseguire un po 'meglio, allora la regex equivalente, se le prestazioni sono un problema.

6

L'approccio RegEx è il più adatto, ma quello che ho davvero bisogno di dire è:

prega, per l'amore di sviluppatori di manutenzione, non si ottiene appeso-up su come ottenere questo fino a 1 riga di codice . Una chiamata al metodo è il tuo vero obiettivo, se finisci per accumulare un gruppo di chiamate in 1 linea per dire che è una linea, allora ti stai sparando ai piedi.

+0

Non è proprio il mio obiettivo principale portarlo a una linea per scopi di sviluppo, più per "avere un'ape nel mio cappello perché non ha funzionato come pensavo che dovrebbe, e voglio capire come farlo". .. :) – hitch

+3

+1 per gli sviluppatori di manutenzione - stato lì, fatto quello, aveva quel mal di testa! =) – Rob

5

Non credevo a Bittercode come ha detto che LINQ avrebbe sovraperformato regex. Quindi ho fatto un piccolo test solo per essere sicuro.

tre esempi di come fare questo:

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 

I risultati:

Performance results

Così, il ciclo for con String.Replace outperformes tutti gli altri metodi.

Per questo motivo, creerò una funzione di estensione dell'oggetto stringa.

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 

allora si potrebbe utilizzare questa funzione piacevole e essere letti in una sola riga:

_textToStrip.ReplaceAll(_invalidChars, CChar(String.Empty)) 
0

Qual è il modo migliore per ripetere la dichiarazione linea, se davvero si vuole utilizzare quel codice:

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 

Ad esempio: se si digita: 012ALP456HA90BET678 l'output sarà: ALPHABET.

+0

Benvenuti in StackOverflow. Si prega di dare un'occhiata alle modifiche che ho fatto alla tua domanda in modo da sapere come fare meglio domande in futuro. – Brett

+0

è il metodo più performante e più elegante – serhio

0
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 
Problemi correlati