在VB.NET中,在一行代码中替换字符串中的多个字符

在VB.NET中,在一行代码中替换字符串中的多个字符,vb.net,string,replace,Vb.net,String,Replace,使用VB.NET,我希望能够在一行代码中替换字符串中的一系列字符 也就是说,类似于: Dim charsToReplace as string = "acegi" Dim stringToBeReplaced as string = "abcdefghijklmnop" charsToReplace.ToArray().ForEach(Function (c) stringTobeReplaced = stringTobeReplaced.Replace(c, "")) 然而,这不起作用 以

使用VB.NET,我希望能够在一行代码中替换字符串中的一系列字符

也就是说,类似于:

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

可以这样做吗?

字符串类有一个替换方法来完成此操作。您可以这样使用它:

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

如果我读对了,您正在尝试从字符串中删除字符列表。这非常适合正则表达式

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

(您需要导入System.Text.RegularExpressions)

我推荐Jon Galloway的方法,正则表达式是合适的方法,未来的开发人员将为此感谢您:)-尽管使用Linq解决这个问题也不是一个难题。下面是一些(未经测试的)C#代码:

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

如果性能有问题的话,我怀疑这段代码的性能可能会比regex等效代码稍好一些。

regex方法是最合适的,但我真正需要说的是:


出于对维护开发人员的热爱,请不要把这段代码缩减到一行。一个方法调用是你真正的目标,如果你最终只是把一堆调用堆积到一行中,说它是一行,那么你就是在自食其果。

我不相信Bitercode,因为他说LINQ会比regex表现更好。 所以我做了一个小测试来确定

如何做到这一点的三个示例:

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
结果是:


因此,使用string.replace的for循环优于所有其他方法

因此,我将对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

如果您确实想使用该代码,那么重复line语句的最佳方法是什么:

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

我的主要目标并不是为了开发目的而将其排到一行,更多的是为了“我的帽子里有一只蜜蜂,因为它没有按照我认为的方式工作,并且想弄清楚如何去做”的目的……)+1对于维护开发人员-曾经去过那里,做过那件事,让人头疼我可能不太清楚,但我想替换字符串中每个字符的每个实例。i、 e.chars=“ace”longString=“abcdeabcde”result=“bdbdbd”replace无法执行此操作。您可以在同一语句中多次使用replace:myDate2=Date.Now.ToString(“s”).replace(“:”,“-”).replace(“T”,”)这是一种“应该提出确切的问题,而不是重新措辞”的情况。更详细地说,我实际上有一个字符串,它基本上是一系列单词,由空格分隔。我有一个要从字符串中去掉的单词数组,因此我认为foreach可能/有用。当以这种方式提出(不同的)问题时,Regex是不合适的。所以基本上:dim words()作为string=(“the”,“brown”,“lazy”)dim句子作为string=“the quick brown fox jumps”results=“quick fox jumps”我的希望是words.ForEach(Function(w)语句。Replace(w)”)欢迎使用stackoverflow。请看一下我对您的问题所做的编辑,以便您知道如何更好地在将来提问。如果经常使用该方法,该方法的性能如何?@serhio:Regex实际上是为字符串操作而设计的。无论您使用什么方法来处理字符串,Regex都会更快,并且使用更少的资源。@SimonDugré如我的回答(比你的评论早)所示,情况正好相反。正则表达式的速度要慢得多。两个数组必须相互平行,你可以替换简单的字符和/或字符串,但每个数组中的元素数必须相同。希望这是清楚的,也希望这是有用的。。。
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
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
Private Sub cmdTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdTest.Click
    Dim s As String = "México Juárez índice recúrso dirección"
    Dim arr() As String = {"á", "é", "í", "ó", "ú", "Ñ", "ñ"}
    Dim rep() As String = {"a", "e", "i", "o", "u", "N", "n"}
    Dim i As Integer = Nothing

    For i = 0 To UBound(arr)
        s = Replace(s, arr(i), rep(i))
    Next

    MsgBox(s)

End Sub