Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 删除字符串VB.net开头的3个特定字符(如果存在)_Regex_Vb.net_String_Replace_Trim - Fatal编程技术网

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年后,我才看到这条评论,显然我已经进化了一点。我现在更喜欢
。也许是因为我越来越老,越来越聪明,也许是关节炎开始发作,我想少打字…谁知道。。。