结论:我使用了一个正则表达式,它在一行代码中处理任意长度的字符串中的数字和字母。
dim rtn as String = Regex.Replace(input, "..", "$& ")
我想取任意长度的 numeric 字符串,每2个字符插入一个空格。 因此1233456变为12 33 45 6。
有没有办法可以将格式用作字符串或IFormatProvider,比如?这会限制字符串的长度,对吧?因为我要投入很长时间。
CLng((input)).ToString("## ")
编辑 - 这是原始问题。 我想取任意长度的字符串并每2个字符插入一个空格。 123dssas4rr应该变为12 3d ss为4r r
我笨拙地使用
Dim rtn As String = String.Empty
Dim i As Integer = 0
For Each a In input.ToCharArray
rtn = String.Concat(rtn, a)
i = i + 1
If i Mod 2 = 0 Then
rtn = String.Concat(rtn, " ")
End If
Next
答案 0 :(得分:5)
string rtn = Regex.Replace(input, "..(?=.)", "$& ");
或在VB中
dim rtn as String = Regex.Replace(input, "..(?=.)", "$& ")
您需要导入System.Text.RegularExpressions
(或在Regex
之前添加命名空间名称。
如果您愿意在替换后Trim
字符串,那么您可以完全摆脱括号(及其中的内容)。但是,您需要一个或另一个,因此具有偶数个字符的字符串最后没有额外的空格。
答案 1 :(得分:4)
也许不是最漂亮的,但简单快速的方法是普通的旧StringBuilder:
Const charNumber = 2
Dim oldString = "123dssas4rr"
Dim sb As New System.Text.StringBuilder()
For i As Integer = 0 To input.Length - 1
If i Mod charNumber = 0 Then
sb.Append(" "c)
End If
sb.Append(input(i))
Next
Dim newString = sb.ToString()
修改强>:
将StringBuilder与Regex方法进行比较只是为了感兴趣:
Dim timer As New Stopwatch
Dim regexTime As TimeSpan, stringBuilderTime As TimeSpan
Dim input As String = "123dssas4rr"
Dim result As String
timer.Start()
For i As Int32 = 1 To 10000000
result = Regex.Replace(input, "..(?=.)", "$& ")
Next
timer.Stop()
regexTime = timer.Elapsed
timer.Restart()
Const charNumber = 2
For i As Int32 = 1 To 10000000
Dim sb As New System.Text.StringBuilder()
For chr As Integer = 0 To input.Length - 1
If chr Mod charNumber = 0 Then
sb.Append(" "c)
End If
sb.Append(input(chr))
Next
result = sb.ToString()
Next
timer.Stop()
stringBuilderTime = timer.Elapsed
结果:
Regex: 00:00:40.8928958
StringBuilder: 00:00:03.3468080
StringBuilder在1000万次迭代中的速度提高了12倍,即使它在每次迭代时都会创建一个新的StringBuilder对象。差异将越大,字符串越长。有时候更短的解决方案并不快,同样适用于LINQ方法。
即使这个测试实际上并不重要,如果我将其更改为从具有500.000个字符(500kb)的文件中读取字符串并迭代100次,那么StringBuilder的结果会更好:
Regex: 00:00:15.8409331
StringBuilder: 00:00:00.8262289
StringBuilder方法快了近20倍。
这是一个扩展版本:
Public Module StringExtensions
<Runtime.CompilerServices.Extension()>
Public Function InsertStringRepeatedly(ByVal input As String, ByVal separator As String, ByVal length As Int32) As String
Dim sb As New System.Text.StringBuilder()
For chr As Integer = 0 To input.Length - 1
If chr Mod length = 0 Then
sb.Append(separator)
End If
sb.Append(input(chr))
Next
Return sb.ToString()
End Function
End Module
您可以通过以下方式调用它:
Dim result = input.InsertStringRepeatedly(" ", 2)
答案 2 :(得分:2)
我会给你算法和代码,好吗?
瞧!
答案 3 :(得分:0)
你可以做一些像这个简单的事情
Dim newString AS Char() = oldString.ToCharArray()
For i = 0 To i = oldString.Length - 1
If i Mod 2 = 0 Then Array.Add(newString, " ")
Array.Add(newString, oldString(i))
Next
String.Join(newString, "")