首页 > 解决方案 > 是否可以存储正则表达式匹配并将其中的一部分用作列表枚举器?

问题描述

我创建了一个 MadLibs 风格的游戏,用户在其中输入对提示的响应,这些提示依次替换故事中的空白,由 %s0、%s1 等表示。我使用 for 循环进行这项工作,但其他人建议我可以使用正则表达式来完成。到目前为止,我所拥有的内容如下,它将 %s+number 的所有实例替换为“wibble”。我想知道是否可以将正则表达式找到的数字存储在一个临时变量中,然后使用它从单词列表中返回一个值?例如return Regex.Replace(story, pattern, Global.Words[x]);x正则表达式模式在遍历字符串时返回的数字在哪里。

    static void Main(string[] args)
    {

        Globals.Words = new List<string>();
        Globals.Words.Add("nathan");
        Globals.Words.Add("bob");

        var text = "Once upon a time there was a %s0 and it was %s1";
        Console.WriteLine(FindEscapeCharacters(text));
    }

    public static string FindEscapeCharacters(string story)
    {
        var pattern = @"%s([0-9]+)";
        return Regex.Replace(story, "%s([0-9]+)", "wibble");
    }

在此先感谢,内森。

标签: c#regex

解决方案


不是直接回答您关于正则表达式的问题,但如果我理解正确,有一种更简单的方法可以做到这一点:

string baseString = "I have a {0} {1} in my {0} {2}.";

List<string> words = new List<string>() { "red", "cat", "hat" };

string outputString = String.Format(baseString, words.ToArray());

outputStringI have a red cat in my red hat.

这不是您想要的,还是您的问题还有更多我想念的?


小细节

String.Format使用以下签名:

string Format(string format, params object[] values)

巧妙的params是,您可以单独列出值:

var a = String.Format("...", valueA, valueB, valueC);

但你也可以直接传入一个数组:

var a = String.Format("...", valueArray);

Note that you can't mix and match the two approaches.


推荐阅读