C# 是否可以存储正则表达式匹配项并将其部分用作列表枚举器?

C# 是否可以存储正则表达式匹配项并将其部分用作列表枚举器?,c#,regex,C#,Regex,我已经创建了一个MadLibs风格的游戏,用户在游戏中输入对提示的响应,这些提示将替换故事中的空格,如%s0、%s1等。我使用for循环实现了这一点,但有人建议我可以使用regex实现。到目前为止,我得到的是以下内容,它将%s+number的所有实例替换为“wibble”。我想知道的是,是否可以将正则表达式找到的数字存储在一个临时变量中,然后使用它从列表中返回一个值?例如返回Regex.Replace(故事、模式、全局词[x])其中x是正则表达式模式遍历字符串时返回的数字 static

我已经创建了一个MadLibs风格的游戏,用户在游戏中输入对提示的响应,这些提示将替换故事中的空格,如%s0、%s1等。我使用for循环实现了这一点,但有人建议我可以使用regex实现。到目前为止,我得到的是以下内容,它将%s+number的所有实例替换为“wibble”。我想知道的是,是否可以将正则表达式找到的数字存储在一个临时变量中,然后使用它从列表中返回一个值?例如
返回Regex.Replace(故事、模式、全局词[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");
    }
static void Main(字符串[]args)
{
Globals.Words=新列表();
Globals.Words.Add(“nathan”);
Globals.Words.Add(“bob”);
var text=“从前有一个%s0,它是%s1”;
Console.WriteLine(FindEscapeCharacters(text));
}
公共静态字符串FindEscapeCharacters(字符串故事)
{
变量模式=@“%s([0-9]+)”;
返回Regex.Replace(story,“%s([0-9]+)”,“wibble”);
}
提前谢谢你,Nathan。

这里有一个函数,它不是用字符串作为最后一个参数,而是用
MatchEvaluator
委托-一个函数,它接受
Match
对象并返回
string

您可以让该函数解析来自
匹配
组[1]的整数。值
属性,然后使用该属性将其索引到列表中,返回找到的
字符串。

这里有一个,而不是将字符串作为最后一个参数,接受
匹配计算器
委托-接受
匹配
对象并返回
字符串
的函数


您可以让该函数解析来自
匹配
组[1]的整数。值
属性,然后使用该属性索引到列表中,返回找到的
字符串。

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

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());
params
的巧妙之处在于,您可以单独列出值:

var a = String.Format("...", valueA, valueB, valueC);
但也可以直接传入数组:

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

请注意,您不能将这两种方法混合使用。

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

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());
params
的巧妙之处在于,您可以单独列出值:

var a = String.Format("...", valueA, valueB, valueC);
但也可以直接传入数组:

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

请注意,您无法混合和匹配这两种方法。

是的,您使用
Regex.Replace的尝试非常接近;最后一步是将常量“wibble”更改为lambda
match=>如何替换匹配项:

  var text = "Once upon a time there was a %s0 and it was %s1";

  // Once upon a time there was a nathan and it was bob
  var result = Regex.Replace(
    text, 
   "%s([0-9]+)", 
    match => Globals.Words[int.Parse(match.Groups[1].Value)]);
编辑:如果您不想按组的编号捕获组,可以显式命名它们:

//从前有一个内森,是鲍勃
var result=Regex.Replace(
文本
“%s(?[0-9]+)”,
match=>Globals.Words[int.Parse(match.Groups[“number”].Value)];

是的,您使用
正则表达式的尝试非常接近。请替换
;最后一步是将常量“wibble”更改为lambda
match=>如何替换匹配项:

  var text = "Once upon a time there was a %s0 and it was %s1";

  // Once upon a time there was a nathan and it was bob
  var result = Regex.Replace(
    text, 
   "%s([0-9]+)", 
    match => Globals.Words[int.Parse(match.Groups[1].Value)]);
编辑:如果您不想按组的编号捕获组,可以显式命名它们:

//从前有一个内森,是鲍勃
var result=Regex.Replace(
文本
“%s(?[0-9]+)”,
match=>Globals.Words[int.Parse(match.Groups[“number”].Value)];

您能给出一个输入和输出预期pls的示例吗?很多单词,我不能清楚地理解,输入将是如上所述的
var text
。输出看起来像
从前,有一个nathan,是bob
。这有帮助吗?你能举一个输入和输出预期pls的例子吗?很多单词,我不能清楚地理解,输入将是如上所述的
var text
。输出看起来像
从前,有一个nathan,是bob
。这有帮助吗?是的,这更简单。是的,这就是我想要的输出。我使用for循环和string.replace做了类似的事情。问题是试图帮助我确定是否可以像建议我的那样使用regex做同样的事情。我对正则表达式不是很熟悉,所以我认为这可能是一个很好的练习,可以帮助我掌握它。@nathanjw:regex是一个强大的工具,任何使用它们的练习都是有用的。但我也了解到,当存在更简单的选项时,应该真正避免正则表达式,因为它们可能很难维护或修改。当然,你可以随心所欲地解决它,只是要记住,使用正则表达式作为解决方案通常是过分的,如果存在合理的替代方案,你最好避免使用它们。谢谢你对正则表达式的建议,我会记住的。我尽量避免:)正如你所说,
String.Format()
方法对于我来说更简单、更干净。在测试完这个之后,我想我会用它来代替for循环,因为它更灵活,可以更好地格式化输入字符串。谢谢:-啊,那简单多了。是的,这就是我想要的输出。我使用for循环和string.replace做了类似的事情。问题是试图帮助我确定是否可以像建议我的那样使用regex做同样的事情。我对正则表达式不是很熟悉,所以我认为这可能是一个很好的练习,可以帮助我掌握它。@nathanjw:regex是一个强大的工具,任何使用它们的练习都是有用的。但我也了解到,当存在更简单的选项时,应该真正避免正则表达式,因为它们可能很难维护或修改。Y