Vb.net 从文本框中查找并替换一系列文本
在Visual Basic项目中,我试图替换来自文本框的URL的一部分。例如,我有一个Vb.net 从文本框中查找并替换一系列文本,vb.net,Vb.net,在Visual Basic项目中,我试图替换来自文本框的URL的一部分。例如,我有一个https://lh3.googleusercontent.com/blahblahblah/s912-Ic42/blahblahblah.jpgURL进入TextBox1,我想用/s1600-替换部件/s912- 我是这样做的:dimURL=Replace(TextBox1.Text,“/s912-”,“/s1600-”)。但是,这个URL并不是每次都一样。例如,零件/s912-可以是/s800-。因此,我的
https://lh3.googleusercontent.com/blahblahblah/s912-Ic42/blahblahblah.jpg
URL进入TextBox1
,我想用/s1600-
替换部件/s912-
我是这样做的:dimURL=Replace(TextBox1.Text,“/s912-”,“/s1600-”
)。但是,这个URL并不是每次都一样。例如,零件/s912-
可以是/s800-
。因此,我的下一个想法是使用asterik:Dim url=Replace(TextBox1.Text,“/s*-”,“/s1600-”
)。当然不行了!所以我需要语法方面的帮助或者更好的主意
Dim url As String = "https://lh3.googleusercontent.com/blahblahblah/s912-Ic42/blahblahblah.jpg"
Dim pattern As String = "\/[sS][0-9]+-"
Dim newPart As String = "/s1600-"
Dim newUrl As String
Dim m as Match = regex.Match(url, pattern)
If m.Success Then
Dim curr as String = url.Substring(m.Index, m.Length)
newUrl = url.Replace(curr, newPart)
End If
' Test
Console.WriteLine(newUrl)
结果:
结果:
可用于使用搜索/替换
输出是:
可用于使用搜索/替换
输出是:
考虑一下这个实验。我想向您展示另一种方法,以及为什么Regex
有时是有害的。尽管如此,我并不是说在您的情况下不应该使用Regex的静态调用
Dim url As String = "https://lh3.googleusercontent.com/blahblahblah/s912-Ic42/blahblahblah.jpg"
Dim sw As new System.Diagnostics.stopwatch()
sw.Start()
' Lets see how code can do without regex
Dim joined As String
For t as Integer = 1 to 5000
Dim pos as Integer
Dim results() As String = url.Split("/".ToCharArray(), StringSplitOptions.None)
For i As Integer = 0 To results.Length - 1
If results(i).Length > 1 AndAlso results(i).StartsWith("s", StringComparison.OrdinalIgnoreCase) Then
pos = results(i).IndexOf("-", 1)
If pos > 1 Then ' we care only of "s+[0-9]"
results(i) = results(i).Replace(results(i).Substring(0, pos), "/s1600-")
End If
End If
Next
joined = String.Join("/", results, 0, results.Length)
Next
sw.Stop()
Console.WriteLine("Non-Regex: " & sw.ElapsedMilliseconds & " ms. Output: " & joined)
' New Test
sw.reset()
' Lets see how nice shared regex call really is
Dim output As String
sw.Start()
For t As Integer = 1 to 5000
output = Regex.Replace(url, "\/s\d+-", "/s1600-")
Next
sw.Stop()
Console.WriteLine("Regex Static: " & sw.ElapsedMilliseconds & " ms. Output: " & output)
sw.Reset()
Dim output2 As String
sw.Start()
Dim rx As New Regex("\/s\d+-")
For t As Integer = 1 To 5000
output2 = rx.Replace(url, "/s1600-")
Next
sw.Stop()
Console.WriteLine("Regex Instance: " & sw.ElapsedMilliseconds & " ms. Output: " & output2)
抽样结果:
非正则表达式:14毫秒。
正则表达式静态:15毫秒。
正则表达式实例:9毫秒。
非正则表达式:13毫秒。
正则表达式静态:14毫秒。
正则表达式实例:8毫秒。
非正则表达式:13毫秒。
正则表达式静态:14毫秒。
正则表达式实例:8毫秒。
非正则表达式:15毫秒。
正则表达式静态:14毫秒。
正则表达式实例:8毫秒。
非正则表达式:13毫秒。
正则表达式静态:16毫秒。
正则表达式实例:8ms
我看到的是调用Regex实例方法效果更好。非正则表达式方法将随着url变长而性能变差。但是,正则表达式也是如此。我用更多的部分使url变长,并开始
非正则表达式:33毫秒。
正则表达式静态:26毫秒。
正则表达式实例:21ms
所以,比方说,若url变长,但路径部分的数量保持不变,正则表达式将失去一些性能,非正则表达式方法也将失去一些性能,但不会有太多。但如果你添加了部分,非正则表达式将真正恶化
您可以根据自己的具体用途优化代码。不要认为使用一种方法胜过另一种方法总是正确的 考虑一下这个实验。我想向您展示另一种方法,以及为什么Regex
有时是有害的。尽管如此,我并不是说在您的情况下不应该使用Regex的静态调用
Dim url As String = "https://lh3.googleusercontent.com/blahblahblah/s912-Ic42/blahblahblah.jpg"
Dim sw As new System.Diagnostics.stopwatch()
sw.Start()
' Lets see how code can do without regex
Dim joined As String
For t as Integer = 1 to 5000
Dim pos as Integer
Dim results() As String = url.Split("/".ToCharArray(), StringSplitOptions.None)
For i As Integer = 0 To results.Length - 1
If results(i).Length > 1 AndAlso results(i).StartsWith("s", StringComparison.OrdinalIgnoreCase) Then
pos = results(i).IndexOf("-", 1)
If pos > 1 Then ' we care only of "s+[0-9]"
results(i) = results(i).Replace(results(i).Substring(0, pos), "/s1600-")
End If
End If
Next
joined = String.Join("/", results, 0, results.Length)
Next
sw.Stop()
Console.WriteLine("Non-Regex: " & sw.ElapsedMilliseconds & " ms. Output: " & joined)
' New Test
sw.reset()
' Lets see how nice shared regex call really is
Dim output As String
sw.Start()
For t As Integer = 1 to 5000
output = Regex.Replace(url, "\/s\d+-", "/s1600-")
Next
sw.Stop()
Console.WriteLine("Regex Static: " & sw.ElapsedMilliseconds & " ms. Output: " & output)
sw.Reset()
Dim output2 As String
sw.Start()
Dim rx As New Regex("\/s\d+-")
For t As Integer = 1 To 5000
output2 = rx.Replace(url, "/s1600-")
Next
sw.Stop()
Console.WriteLine("Regex Instance: " & sw.ElapsedMilliseconds & " ms. Output: " & output2)
抽样结果:
非正则表达式:14毫秒。
正则表达式静态:15毫秒。
正则表达式实例:9毫秒。
非正则表达式:13毫秒。
正则表达式静态:14毫秒。
正则表达式实例:8毫秒。
非正则表达式:13毫秒。
正则表达式静态:14毫秒。
正则表达式实例:8毫秒。
非正则表达式:15毫秒。
正则表达式静态:14毫秒。
正则表达式实例:8毫秒。
非正则表达式:13毫秒。
正则表达式静态:16毫秒。
正则表达式实例:8ms
我看到的是调用Regex实例方法效果更好。非正则表达式方法将随着url变长而性能变差。但是,正则表达式也是如此。我用更多的部分使url变长,并开始
非正则表达式:33毫秒。
正则表达式静态:26毫秒。
正则表达式实例:21ms
所以,比方说,若url变长,但路径部分的数量保持不变,正则表达式将失去一些性能,非正则表达式方法也将失去一些性能,但不会有太多。但如果你添加了部分,非正则表达式将真正恶化
您可以根据自己的具体用途优化代码。不要认为使用一种方法胜过另一种方法总是正确的 你听说过正则表达式吗?regex101.com使用a。是的,我在谷歌上找到了这个,但我不懂语法。也许是因为我的脑袋现在要爆炸了。请给我举个例子,好吗?我给你增加了另一个答案,一个实验。它向您展示了不同的方法和性能含义您听说过正则表达式吗?regex101.com使用a。是的,我在谷歌上找到了这个,但我不懂语法。也许是因为我的脑袋现在要爆炸了。请给我举个例子,好吗?我给你增加了另一个答案,一个实验。它向您展示了不同的方法和性能含义您的正确率为99%。。。我还应该在代码顶部添加这个Imports System.Text.RegularExpressions
。非常感谢!!!:)T.S.给出的模式与S
或S
匹配,这对您来说可能重要,也可能不重要。如果需要,您可以在上面的Replace
调用中使用它们的模式。谁知道呢,URL不区分大小写。你是99%正确的。。。我还应该在代码顶部添加这个Imports System.Text.RegularExpressions
。非常感谢!!!:)T.S.给出的模式与S
或S
匹配,这对您来说可能重要,也可能不重要。如果需要,您可以在上面的Replace
调用中使用它们的模式。谁知道呢,URL不区分大小写。非常感谢您的回答!非常感谢您的回答!