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

hit*_*tch 13 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, ""))
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.

以下工作正常,但我不希望该字符串是类级变量:

 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
Run Code Online (Sandbox Code Playgroud)

可以这样做吗?

Jon*_*way 26

如果我读得正确,你试图从字符串中删除一个字符列表.这非常适合RegEx.

Console.WriteLine(Regex.Replace("abcdefghijklmnop", "[acegi]", string.Empty))
Run Code Online (Sandbox Code Playgroud)

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


STW*_*STW 8

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

请注意,对于维护开发人员的热爱,请不要将其归结为一行代码.一个方法调用是你的真正目标,如果你最终只是将一堆调用打成一行来说它是一行,那么你就是在自己的脚下射击.

  • 为维护开发人员+1 - 去过那里,做到了,头疼!=) (5认同)

JDC*_*JDC 6

我不相信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
Run Code Online (Sandbox Code Playgroud)

结果:

表现结果

因此,使用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
Run Code Online (Sandbox Code Playgroud)

然后你可以在一行中使用这个函数很好并且可读:

_textToStrip.ReplaceAll(_invalidChars, CChar(String.Empty))
Run Code Online (Sandbox Code Playgroud)


dan*_*ish 1

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

YourString = YourString.Replace("OldValue", "NewValue")
Run Code Online (Sandbox Code Playgroud)

  • 实际上,您可以在同一条语句上多次使用 Replace : myDate2 = Date.Now.ToString("s").Replace(":", "-").Replace("T", " ") (2认同)