1

我需要用某个值替换给定字符串中的所有标记字符串,例如:

"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;
}
4

3 回答 3

2

尝试类似的东西\$(?<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对于它在字符串中找到的每个匹配项,都会调用一次以上内容,从而允许您返回替换字符串。

于 2013-10-10T19:36:29.630 回答
1

您可以使用下面的代码来替换一个标签。

 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]);
}
于 2013-10-10T19:27:29.380 回答
1

考虑以下内容以匹配占位符...

\$\w*

于 2013-10-10T19:52:50.900 回答