string VB.NET用一行代码替换字符串中的多个字符
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1332454/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Replace multiple characters in string in one line of code in VB.NET
提问by hitch
Using VB.NET I'd like to be able to replace a range of characters in a string in a single line of code.
使用 VB.NET 我希望能够在一行代码中替换字符串中的一系列字符。
I.e., something like:
即,类似于:
Dim charsToReplace as string = "acegi"
Dim stringToBeReplaced as string = "abcdefghijklmnop"
charsToReplace.ToArray().ForEach(Function (c) stringTobeReplaced = stringTobeReplaced.Replace(c, ""))
However, this doesn't work.
但是,这不起作用。
The following does work, however I don't want the string to be a class level variable:
以下确实有效,但是我不希望字符串成为类级别变量:
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
Can this be done?
这能做到吗?
回答by Jon Galloway
If I read this correctly, you're trying to strip a list of characters from a string. This is a good fit for a RegEx.
如果我没看错,您就是在尝试从字符串中删除字符列表。这非常适合 RegEx。
Console.WriteLine(Regex.Replace("abcdefghijklmnop", "[acegi]", string.Empty))
(you'll need to import System.Text.RegularExpressions)
(您需要导入 System.Text.RegularExpressions)
回答by STW
The RegEx approach is the best suited, but what I really need to say is:
RegEx 方法是最合适的,但我真正需要说的是:
Please, for the love of maintenance developers, don't get hung-up on getting this down to 1 line of code. One method call is your real goal, if you end up just piling a bunch of calls into 1 line to say it's one-line then you're shooting yourself in the foot.
为了维护开发人员的热爱,请不要纠结于将其缩减为 1 行代码。一个方法调用是你真正的目标,如果你最终只是将一堆调用堆成一行来表示它是一行,那么你就是在用脚射击自己。
回答by JDC
I didn't believe Bittercode as he said that LINQ would outperform regex. So I did a little test just to be sure.
我不相信 Bittercode,因为他说 LINQ 会胜过正则表达式。所以我做了一个小测试,只是为了确定。
Three examples of how to do this:
如何执行此操作的三个示例:
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
The results:
结果:
So, the for loop with string.replace outperformes all the other methods.
因此,带有 string.replace 的 for 循环优于所有其他方法。
Because of this I would make an extension function to the string object.
因此,我将为字符串对象创建一个扩展函数。
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
Then you could use this function nice and readably in one line:
然后你可以在一行中很好地和可读地使用这个函数:
_textToStrip.ReplaceAll(_invalidChars, CChar(String.Empty))
回答by danish
The String class has a replace method to do this. You can use it this way:
String 类有一个替换方法来执行此操作。你可以这样使用它:
YourString = YourString.Replace("OldValue", "NewValue")
回答by Bittercoder
I recommend Jon Galloway's approach, a regular expression is the appropriate method, and future developers will thank you for it :) - though it's not a difficult problem to solve with Linq as well. Here's some (untested) C# code to do that:
我推荐 Jon Galloway 的方法,正则表达式是合适的方法,未来的开发人员会感谢你:) - 尽管用 Linq 解决这不是一个困难的问题。这是一些(未经测试的)C# 代码来做到这一点:
string stringToBeReplaced = "abcdefghijklmnop";
string charsToReplace = "acegi";
stringToBeReplaced = new String(stringToBeReplaced.Where(c => !charsToReplace.Any(rc => c == rc)).ToArray());
I suspect this code will probably perform slightly better then the regex equivalent, if performance is an issue.
如果性能是一个问题,我怀疑这段代码的性能可能会比等价的正则表达式略好。
回答by user1982529
What is the best way to repeat the line statement if you really want to use that code:
如果您真的想使用该代码,重复该行语句的最佳方法是什么:
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
For example: if you typed: 012ALP456HA90BET678
the output would be: ALPHABET
.
例如:如果您输入:012ALP456HA90BET678
输出将是:ALPHABET
。
回答by Ashutosh
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
回答by Diprotask
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