替换C#中的子字符串

本文关键字:字符串 替换 | 更新日期: 2023-09-27 18:10:13

我有以下字符串,"Last Run:2011-10-03 13:58:54(7m 30s ago([status]",我想用我生成的另一个字符串替换"7m 30s"(它不是固定字符串(。如何在C#中使用字符串操作来做到这一点?

替换C#中的子字符串

string str = "Last Run : (3m 4s ago) [status]";
str = str.Replace("3m 4s", "yournewstring");

更新:

参考:卡什的回答。

若时间不固定,可能是小时、天、分钟和秒,那个么正则表达式是最好的选择,因为它是由Kash完成的。你可以这样做:

string str = "Last Run: 2011-10-03 13:58:54 (7m 30s  ago) [status]";
string replacement = "test";
string pattern = @"'((.+?)'s+ago')";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(str, "(" + replacement + " ago)");
MessageBox.Show(result);

您应该考虑使用String.Format来代替这个

string result = String.Format("Last Run : ({0} ago) [status]", theTime);

只有当您能够控制有问题的字符串时,才可以执行此操作。

为了解决这个问题,最方便的方法是使用RegEx和String的组合。像下面的代码一样替换。我假设您没有权限生成此输入字符串(上次运行:2011-10-03 13:58:54(7米30秒前([status](。

它基本上有三个阶段:

定位模式:

我使用输入字符串中的大括号和"ago"作为模式来定位需要替换的持续时间。"((.+?(''s+ago("是使用的模式。它使用惰性量词"?"来确保它进行最小匹配,而不是贪婪匹配。可能不适用于您的示例,但如果该方法将在其他场景中重用,则会有所帮助。

创建backreference组以获得精确的子字符串7m30s

Regex.Match使用该模式并创建包含"7m30s"的组。请注意,第一组是整场比赛。第二组是模式中指定的支撑中的内容,在这种情况下为"7米30秒"。即使以后你得到的持续时间看起来像:"上次跑步:2011-10-03 13:58:54(1d 3小时20米5秒前([状态]">

替换出现的

然后使用String.Replace将此子字符串替换为替换字符串。为了使其更通用,下面的方法Replace将接受backreference的输入字符串、替换字符串、模式和组号(在这种情况下只有一个组(,以便您可以在不同的场景中重用此方法。

    private void button1_Click(object sender, EventArgs e)
    {
        string inputString = "Last Run: 2011-10-03 13:58:54 (7m 30s  ago) [status]";
        string replacementString = "Blah";
        string pattern = @"'((.+?)'s+ago')";
        int backreferenceGroupNumber = 1;
        string outputString = Replace(inputString, replacementString, pattern, backreferenceGroupNumber);
        MessageBox.Show(outputString);
    }
    private string Replace(string inputString, string replacementString, string pattern, int backreferenceGroupNumber)
    {
        return inputString.Replace(Regex.Match(inputString, pattern).Groups[backreferenceGroupNumber].Value, replacementString);
    }

这已经过测试,并输出"上次运行:2011-10-03 13:58:54(Blah ago([状态]"。

注意:

  • 可以适当地修改IsNullOrEmpty的Replace方法检查和/或空检查
  • button_Click是我用来测试的示例事件处理程序它。您可以在核心代码中提取其中的一部分
  • 如果您确实有权生成输入字符串,那么您可以在生成字符串本身时控制持续时间部分,而不是使用此代码来替换任何内容

您可以在字符串上使用String.Replace方法,如:

var myString = "Last Run : (3m 4s ago) [status]";
var replacement = "foo";
myString = myString.Replace("3m 4s ago", replacement);

或者你可能想使用一个正则表达式,比如:

var rgx = new Regex(@"'d+m 'd+s ago");
myString = rgx.Replace(myString, replacement);

上面的正则表达式只是一个示例,没有经过测试。

你可以试试这个:

        string s = "Last Run : (3m 4s ago) [status]";
        s = s.Replace("3m 4s", myString);

使用String.Replace((函数,也可以参见下面的代码。

stirng YourString = "Last Run : (3m 4s ago) [status]";
YourString = YourString.Replace("3m 4s","Your generated String");
string input = "Last Run: 2011-10-03 13:58:54 (7m 30s  ago) [status] ";
string pattern = @"('d+h 'd+m 'd+s|'d+m 'd+s|'d+s)";
string replacement = "yay";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(input, replacement);
Console.WriteLine("Original String: {0}", input);
Console.WriteLine("Replacement String: {0}", result);  

这是http://msdn.microsoft.com/en-us/library/xwewhkd1.aspx只是改变了输入和模式。。。

模式可以改进,因为在输入字符串中,您可能只收到秒或小时、分钟和秒regex 的改进

怎么样:

Regex.Replace(yourString, @"'(.+')", string.Format("({0} ago)", yourReplacement));

有点暴力,但应该有效,而且很简单。

解释

@"'(.+')"将匹配一对完整的括号和它们之间的任何内容(所以请确保您只有一对括号,否则这将不起作用(。

string.Format("({0} ago)", yourReplacement)将返回"(yourReplacement ago(">

不要使用字符串。代替只需输出一个新字符串:

TimeSpan elapsed = DateTime.Now.Subtract(lastRun);
string result =  string.Format("Last Run: {0} ({1} ago) [status]", lastRun, elapsed.ToString("%m'm '%s's'"));

这假设lastRun变量是用上次运行时填充的。

this.lastrun是我在问题中定义的字符串。

this.lastRun = this.lastRun.Replace(this.lastRun.Substring(lastRun.IndexOf("(") + 1, (lastRun.IndexOf(")") - lastRun.IndexOf("(") - 1)) , retstr + " ago");