更改另一个字符串中所有标记的字符串
本文关键字:字符串 另一个 | 更新日期: 2023-09-27 18:35:03
我需要用一些值替换给定字符串中所有标记的字符串,例如:
"This is the level $levelnumber of the block $blocknumber."
我想将其翻译为:
"This is the level 4 of the block 2."
这只是一个例子。实际上,我在文本中有几个$data标签,需要在运行时更改为某些数据。我不知道$data标签会串起来。
我打算为此使用正则表达式,但正则表达式真的很令人困惑。
我尝试过但没有成功(有几种双引号变体,没有引号等(:
public static ShowTags (string Expression)
{
var tags = Regex.Matches(Expression, @"('$(['w'd]+)[&$]*");
foreach (var item in tags)
Console.WriteLine("Tag: " + item);
}
任何帮助表示赞赏。
[编辑]
工作代码:
public static ReplaceTagWithData(string Expression)
{
string modifiedExpression;
var tags = Regex.Matches(Expression, @"('$['w'd]+)[&$]*");
foreach (string tag in tags)
{
/// Remove the '$'
string tagname = pdata.Remove(0, 1);
/// Change with current value
modifiedExpression.Replace(pdata, new Random().ToString()); //Random simulate current value
}
return modifiedExpression;
}
尝试类似
'$(?<key>['w'd]+)
的东西。那里有很多正则表达式测试器,我建议其中一个可以轻松试用您的正则表达式。
然后,正如Szymon建议的那样,你可以使用Regex.Replace,但有一个更奇特的方法:
string result = Regex.Replace( s, pattern, new MatchEvaluator( Func ) );
string Func( Match m )
{
return string.Format( "Test[{0}]", m.Groups["key"].Value );
}
上面的Func
将在字符串中找到的每个匹配项调用一次,允许您返回替换字符串。
请考虑以下内容以匹配占位符...
''$''w*
您可以使用下面的代码替换一个标签。
String tag = @"$levelnumber";
String input = @"This is the level $levelnumber of the block $blocknumber.";
string replacement = "4";
String output = Regex.Replace(input, Regex.Escape(tag), replacement);
为了在所有标签的循环中执行此操作(我使用了标签数组和替换来简化它(:
String input = @"This is the level $levelnumber of the block $blocknumber.";
String[] tags = new String[] { "$levelnumber", "$blocknumber" };
String[] replacements = new String[] { "4", "2" };
for (int i = 0; i < tags.Length; i++)
input = Regex.Replace(input, Regex.Escape(tags[i]), replacements[i]);
最终结果是input
.
注意:您可以使用String.Replace
实现相同的目标:
input = input.Replace(tags[i], replacements[i]);
编辑
根据下面的评论,您可以使用以下方式。这将重新识别以 $
开头的所有标记并替换它们。
String input = @"This is the level $levelnumber of the block $blocknumber.";
Dictionary<string, string> replacements = new Dictionary<string,string>();
replacements.Add("$levelnumber", "4");
replacements.Add("$blocknumber", "2");
MatchCollection matches = Regex.Matches(input, @"'$'w*");
for (int i = 0; i < matches.Count; i++)
{
string tag = matches[i].Value;
if (replacements.ContainsKey(tag))
input = input.Replace(tag, replacements[tag]);
}