替换C#中的子字符串
本文关键字:字符串 替换 | 更新日期: 2023-09-27 18:10:13
我有以下字符串,"Last Run:2011-10-03 13:58:54(7m 30s ago([status]",我想用我生成的另一个字符串替换"7m 30s"(它不是固定字符串(。如何在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");