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