Vb.net 从文本框中查找并替换一系列文本

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-。因此,我的

Visual Basic项目中,我试图替换来自文本框的URL的一部分。例如,我有一个
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不区分大小写。非常感谢您的回答!非常感谢您的回答!