【问题标题】:Replace multiple characters in string in one line of code in VB.NET在VB.NET的一行代码中替换字符串中的多个字符
【发布时间】:2010-11-22 21:05:23
【问题描述】:

使用 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

这个可以吗?

【问题讨论】:

  • 这是一个“应该问确切的问题而不是改写它”的案例。详细地说,我实际上有一个字符串,它基本上是一系列单词,用空格分隔。我有一组单词要从字符串中删除,因此我认为 foreach 可能/有用。当以这种方式提出(不同的)问题时,Regex 不适合。所以基本上:dim words() as string = ("the", "brown", "lazy") dim sentence as string = "the quick brown fox jumps" results="quick fox jumps" 我希望是 words.ForEach(函数(w)句.Replace(w, "")

标签: vb.net string replace


【解决方案1】:

String 类有一个替换方法来执行此操作。你可以这样使用它:

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

【讨论】:

  • 我可能还没有完全清楚,但我想替换字符串中每个字符的每个实例。即 chars = "ace" longString = "abcdeabcdeabcde" result = "bdbdbd" replace 无法做到这一点。
  • 您实际上可以在同一个语句中多次使用 Replace:myDate2 = Date.Now.ToString("s").Replace(":", "-").Replace("T" , " ")
【解决方案2】:

如果我没看错,您是在尝试从字符串中删除字符列表。这非常适合 RegEx。

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

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

【讨论】:

  • 如果经常使用该方法的性能如何?
  • @serhio :Regex 实际上是为字符串操作而设计的。无论您使用什么其他方法来处理字符串,正则表达式的处理速度都快得多并且使用的资源更少。
  • @SimonDugré 如我的回答所示(早于您的评论),情况正好相反。正则表达式要慢得多。
【解决方案3】:

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

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

如果性能有问题,我怀疑这段代码的性能可能会比等效的正则表达式稍好一些。

【讨论】:

    【解决方案4】:

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

    出于对维护开发人员的热爱,请不要急于将其缩减为 1 行代码。一个方法调用是您的真正目标,如果您最终只是将一堆调用堆积到 1 行中说它是单行,那么您就是在自取其辱。

    【讨论】:

    • 我的主要目标并不是为了开发目的将它放到一条线上,更多的是因为“我的引擎盖里有一只蜜蜂,因为它没有按照我认为的那样工作,并且想要弄清楚怎么做”的目的...... :)
    • +1 维护开发人员 - 去过那里,做过,很头疼! =)
    【解决方案5】:

    我不相信 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
    

    结果:


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

    因此,我将为字符串对象创建一个扩展函数。

    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
    

    那么你就可以在一行中很好地和可读地使用这个函数了:

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

    【讨论】:

    • Linq 方法涉及在无效字符数组中的线性查找。如果改为 HashSet(Of Char) 会发生什么?
    【解决方案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

    【讨论】:

    • 欢迎来到stackoverflow。请查看我对您的问题所做的修改,以便您知道将来如何更好地提出问题。
    【解决方案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
    

    【讨论】:

      【解决方案8】:
      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
      

      【讨论】:

      • 两个数组必须相互平行增长,您可以替换简单的字符和/或字符串,但每个数组中的元素数量必须相同。希望这很清楚,也希望这很有用......
      猜你喜欢
      • 2011-05-18
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      相关资源
      最近更新 更多