在一行代码在VB.NET替换字符串多个字符(Replace multiple characters

2019-08-02 13:32发布

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

可以这样做?

Answer 1:

如果我读这正确的,你想从一个字符串中去除字符的列表。 这是一个非常适合一个正则表达式。

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

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



Answer 2:

正则表达式的方法是最适合的,但我真的需要说的是:

请为维护开发商的爱,不要在得到这个下降到1行代码挂断。 一个方法调用是你真正的目标,如果你最终只是堆砌了一堆电话到1号线说这是一个线,然后你搬起石头砸自己的脚。



Answer 3:

我不相信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 outperformes所有其他方法。

正因为如此我会做一个扩展函数的字符串对象。

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


Answer 4:

我建议乔恩·加洛韦的做法,正则表达式是适当的方法,以及未来开发商将感谢你的:) - 尽管这不是一个困难的LINQ的解决以及问题。 下面是一些(未经测试)C#代码来做到这一点:

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

我怀疑这可能是代码执行会稍微好一点,然后正则表达式等价的,如果性能是一个问题。



Answer 5:

String类有一个替代的方法来做到这一点。 你可以用这种方式:

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


Answer 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



Answer 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


文章来源: Replace multiple characters in string in one line of code in VB.NET