Regex 删除字符串VB.net开头的3个特定字符(如果存在)
在这种情况下,我需要从字符串中删除前缀(如果存在)Regex 删除字符串VB.net开头的3个特定字符(如果存在),regex,vb.net,string,replace,trim,Regex,Vb.net,String,Replace,Trim,在这种情况下,我需要从字符串中删除前缀(如果存在) Dim str As String = "samVariable" 需要转换为变量 使用TrimStart str = str.trimstart("s"c, "a"c, "m"c) 除了 字符串可能不总是以“sam”开头 例如: Dim str As String = "saleDetails" 这将变成aleDetails 哪一个是错误的,那么更换怎么样 str = str.Replace('sam','') 太棒了!现在: 例1:
Dim str As String = "samVariable"
需要转换为变量
使用TrimStart
str = str.trimstart("s"c, "a"c, "m"c)
除了
字符串可能不总是以“sam”开头
例如:
Dim str As String = "saleDetails"
这将变成aleDetails
哪一个是错误的,那么更换怎么样
str = str.Replace('sam','')
太棒了!现在:
例1:
Dim str As String = "samVariable"
str = str.Replace('sam','')
str = "Variable"
例2:
Dim str As String = "saleDetails"
str = str.Replace('sam','')
str = "saleDetails" (unaffected)
但是
如果:
Dim str As String = "Resample"
str = str.Replace('sam','')
str = "Reple"
这又错了
所以,我的问题是:
如何仅从字符串开头删除“sam”
我原以为TrimStart(“sam”)会起作用,但事实并非如此
if str.StartsWith("sam")
str = str.Substring(3)
end if
不是一行一行,但很容易遵循
str = New Regex("^sam").Replace(str, String.Empty)
正则表达式在字符串开头查找sam
,并将其替换为空,从而有效地从开头删除sam
编辑根据Konrad的评论,共享方法调用会更好:
str = Regex.Replace(str, "^sam", String.Empty)
对第二个选项进行了投票,因为我喜欢简单的一行结构,但我会接受这个答案(在8分钟内,让我们一起来吧!),因为我认为它更容易理解。我更喜欢这个选项,而不是正则表达式-正则表达式可以很棒,但我几乎总是更喜欢可读性。这种情况下的区别是正则表达式引擎在引擎中执行strncmp(p,“sam”,3),然后执行strcpy(p[3],dest)。所有中间人都被裁掉了,使其速度至少是您的方法的两倍。@sln我不知道这两种方法的内部工作原理,但在我针对这一特定情况的基本测试中,正则表达式的运行时间始终是startswith/substring方法的4-5倍。在现实世界中仍然可以忽略不计(100万次迭代中为130/700毫秒),但这是一个很大的区别。@Joe Enos-这似乎有点奇怪。上面的两行代码没有编译成C等价的代码。正则表达式引擎确实如此,但我想这取决于正则表达式是否是预编译的和常量。查找“^sam”并替换为“”优化为等效的C代码。因此,这可能是输入正在录制的引擎的开销,因为只有使用strcpy()进行覆盖。您是如何使用正则表达式以及如何对其进行基准测试的?如果不保存它,则无需构造
regex
实例–使用共享方法。哦,还有String.Empty
是一个讨厌的东西。它比长六倍,
没有一个更清晰。@KonradRudolph谢谢,你说得对,静态的会更好,答案更新。至于<代码>“ vs>代码> string。空,有很多关于这个问题的争论,所以这取决于你认为可读的东西。我个人更喜欢String.Empty
(或者C#中的String.Empty
)。4年后,我才看到这条评论,显然我已经进化了一点。我现在更喜欢“
。也许是因为我越来越老,越来越聪明,也许是关节炎开始发作,我想少打字…谁知道。。。