替换C#中的子字符串

时间:2011-10-03 12:04:28

标签: c# asp.net

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

10 个答案:

答案 0 :(得分:6)

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

更新:

参考:Kash的答案。

如果时间不固定,可能是小时,天,分钟和秒,那么正则表达式是最佳选择,因为它是由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);

答案 1 :(得分:3)

您应该考虑使用String.Format代替此

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

仅当您控制了相关字符串时才会这样做。

答案 2 :(得分:1)

你可以试试这个:

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

答案 3 :(得分:1)

使用String.Replace()功能,并查看以下代码。

stirng YourString = "Last Run : (3m 4s ago) [status]";
YourString = YourString.Replace("3m 4s","Your generated String");

答案 4 :(得分:1)

您可以在字符串上使用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);

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

答案 5 :(得分:1)

要以最方便的方式解决此问题,请使用RegEx和String.Replace的组合,如下面的代码所示。我假设您无法访问此输入字符串的生成(上次运行:2011-10-03 13:58:54(7m 30s ago)[status])。

它基本上有3个阶段:

找到模式:

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

创建反向引用组以获取确切的子字符串7m 30s

Regex.Match使用该模式并创建包含“7m 30s”的组。请注意第一组是整场比赛。第二组是在模式中指定的括号中,在这种情况下是“7m 30s”。这应该是好的,即使以后你得到的持续时间如下:“上次运行:2011-10-03 13:58:54(1d 3h 20m 5s ago)[status]”

替换发生

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

    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);
    }

这已经过测试,输出“Last Run:2011-10-03 13:58:54(Blah ago)[status]”。

备注:

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

答案 6 :(得分:0)

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刚改变输入和模式的例子......

模式可以改进,因为可能在输入字符串中你只收到秒或小时,分钟和秒.... 正则表达式有点改进

答案 7 :(得分:0)

怎么样:

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

有点蛮力,但应该有效并且很简单。

<强>解释

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

string.Format("({0} ago)", yourReplacement)将返回“(yourReplacement前)”

答案 8 :(得分:0)

不要使用string.Replace。只需输出一个新字符串:

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

这假设lastRun变量填充了最后一次运行时间。

答案 9 :(得分:0)

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

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