2009-08-26 46 views
11

使用VB.NET我希望能够用一行代码替换字符串中的一系列字符。用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 

可以这样做?

+0

这是一个“应该问精确问题而不是改写它”的情况。详细说来,我实际上有一个字符串,它基本上是一系列由空格分隔的单词。我有一串我想从字符串中删除的单词,因此我认为为什么我认为每个foreach都可能/有用。当以这种方式询问(不同的)问题时,正则表达式不适用。所以基本上: dim words()as string =(“the”,“brown”,“lazy”) dim sentence as string =“快速棕色狐狸跳跃” results =“快速狐狸跳跃” 我的希望是words.ForEach(Function(w)sentence.Replace(w,“”) – hitch 2009-08-26 06:45:41

回答

1

String类有一个替换方法来做到这一点。你可以这样使用它:

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

我可能还没有完全清楚,但我想替换字符串中每个字符的每个实例,即 chars =“ace” longString = “abcdeabcdeabcde” 结果=“bdbdbd” 取而代之的是不是能够做到这一点 – hitch 2009-08-26 06:42:03

+0

您实际上可以使用替换不止一次在相同的语句:。 myDate2 = Date.Now.ToString(“S”)更换(“:”,“ - ”)。替换(“T”,“” ) – 2015-12-24 16:24:40

24

如果我正确读了这个,你试图从字符串中去掉一个字符列表。这非常适合RegEx。

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

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

+0

如果经常使用该方法的性能如何? – serhio 2013-05-06 10:31:31

+0

@serhio:正则表达式其实是用于字符串操作的。无论你用什么来处理字符串,正则表达式的速度更快,并且使用更少的资源。 – 2013-08-14 13:10:56

+0

@SimonDugré如我的回答(这是比你的评论早)所示,这是相反的。正则表达式要慢得多。 – JDC 2017-10-17 11:54:42

1

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

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

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

6

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

请,为维护开发商的爱,不要挂断上得到这个下降到1行代码。一个方法调用是你的真正目标,如果你最终只是将一堆调用堆成一行来表示它是单行的,那么你就是在自己的脚下开枪。

+0

这不是我的主要目标,因为它的发展目的只有一条路线,更多的是因为“我的帽子里有一只蜜蜂,因为它不适合我的想法,并且想知道如何去做”的目的。 .. :) – hitch 2009-08-26 06:40:32

+3

+1为维护开发商 - 在那里,做到这一点,有这样的头痛! =) – Rob 2009-08-26 06:42:32

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 

结果:

Performance results

所以,for循环与outperformes与string.replace所有其他方法。

因此,我会对字符串对象做一个扩展函数。

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 

然后,你可以使用这个功能不错,可读取一行:

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

什么是重复行语句,如果你真的想使用该代码的最佳方式:

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

+0

欢迎使用stackoverflow。请看看我对你的问题所作的编辑,以便你知道如何在将来更好地提出问题。 – Brett 2013-01-16 06:10:46

+0

远远不是最高效,最优雅的方法 – serhio 2013-05-06 10:29:06

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 
相关问题