Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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
String 是否有.NET函数删除字符串开头的第一个(且仅第一个)事件?_String - Fatal编程技术网

String 是否有.NET函数删除字符串开头的第一个(且仅第一个)事件?

String 是否有.NET函数删除字符串开头的第一个(且仅第一个)事件?,string,String,我使用TrimStart功能执行以下操作: var example = "Savings:Save 20% on this stuff"; example = example.TrimStart("Savings:".ToCharArray()); 我希望这个示例的值为“在这个东西上节省20%” 然而,我得到的是“这个东西的20%” 在阅读了关于TrimStart的文档后,我明白了原因,但现在我想知道.NET中是否有一个函数可以实现我最初尝试的功能 是否有人知道某个函数,这样我就不必创建自己的

我使用TrimStart功能执行以下操作:

var example = "Savings:Save 20% on this stuff";
example = example.TrimStart("Savings:".ToCharArray());
我希望这个示例的值为“在这个东西上节省20%”

然而,我得到的是“这个东西的20%”

在阅读了关于TrimStart的文档后,我明白了原因,但现在我想知道.NET中是否有一个函数可以实现我最初尝试的功能


是否有人知道某个函数,这样我就不必创建自己的函数并跟踪它?

我认为不存在这样的方法,但您可以使用
StartsWith
子字符串
轻松地执行它:

s = s.StartsWith(toRemove) ? s.Substring(toRemove.Length) : s;
您甚至可以将其添加为扩展方法:

public static class StringExtension
{
    public static string RemoveFromStart(this string s, string toRemove)
    {
        if (s == null)
        {
            throw new ArgumentNullException("s");
        }

        if (toRemove == null)
        {
            throw new ArgumentNullException("toRemove");
        }

        if (!s.StartsWith(toRemove))
        {
            return s;
        }

        return s.Substring(toRemove.Length);
    }
}

不,我不相信有任何东西可以在框架中实现这一点。这是一个有点不寻常的要求,国际海事组织


请注意,您应该仔细考虑是要删除“第一个匹配项”还是删除字符串开头的匹配项(如果有)。例如,想想你想用“Hello.Savings:节省20%的费用”来做什么。

使用正则表达式可以很容易地做到这一点

删除字符串开头的引用:

example = Regex.Replace(example, @"^Savings:", "");
example = Regex.Replace(example, @"(?<!Savings:.*)Savings:", "");
删除字符串中的第一个匹配项:

example = Regex.Replace(example, @"^Savings:", "");
example = Regex.Replace(example, @"(?<!Savings:.*)Savings:", "");

example=Regex.Replace(示例@”(?说得好..我的意图只是在字符串的开头,实际上不是第一次出现。但是,只是第一次,不是重复。@Joseph:那样的话,马克的回答应该对你很好。我将把这个留在这里,让你明白一点。谢谢扩展。我试图避免编写自己的代码来做这件事,但我想这是徒劳的我个人喜欢使用条件运算符:
返回s.StartsWith(toRemove)?s.Substring(toRemove.Length):s;
但我知道不是每个人都喜欢条件运算符:)这绝对是一种方法,清晰且易于验证正确性。这是我在生产代码中实际看到的一种可怕的邪恶替代方法(根据示例进行了修改):
example.Split(新[]{“Savings:”},2,StringSplitOptions.RemoveEmptyEntries)[0]
。我不知道原作者在想什么……对我来说,这不像有一个额外的(简单的)选项那么简单方法。特别是,当您需要开始删除正则表达式中具有特殊意义的内容时,它会变得很复杂。@Jon,一点也不,请使用
Regex.Escape()构建字符串
在要匹配的文本上,您很好。是的,但您必须记住这样做……我想很多人不会这么做。我认为Mark的解决方案简单得多。代码行更多,但更难出错。@Jon,我同意这一点。但是,与许多其他事情一样(例如LINQ的延迟执行),这始终是一个知道你在做什么才能把事情做好的问题。