Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在处理匹配后替换匹配_C#_Regex - Fatal编程技术网

C# 在处理匹配后替换匹配

C# 在处理匹配后替换匹配,c#,regex,C#,Regex,在我的程序中,我实现了用变量值替换的令牌 这样的标记是#INT[1-5](这意味着它将被1到5之间的随机整数替换 我已经编写了正则表达式来匹配标记:#INT[\d+-\d+] 但是我不知道如何替换令牌(在处理匹配并计算随机数之后) 到目前为止,我有以下几点: Random random = new Random(); Regex regex = new Regex(@"#INT\[\d+-\d+\]"); MatchCollection matches = regex.Matches("This

在我的程序中,我实现了用变量值替换的令牌

这样的标记是#INT[1-5](这意味着它将被1到5之间的随机整数替换

我已经编写了正则表达式来匹配标记:#INT[\d+-\d+]

但是我不知道如何替换令牌(在处理匹配并计算随机数之后)

到目前为止,我有以下几点:

Random random = new Random();
Regex regex = new Regex(@"#INT\[\d+-\d+\]");
MatchCollection matches = regex.Matches("This is one of #INT[1-5] tests");
foreach (Match m in matches)
{
    if (m.Success)
    {
        var ints = m.Value.Split('-').Select(x => Convert.ToInt32(x)).ToArray();
        int intToInsert = random.Next(ints[0], ints[1]);
        //now how do I insert the int in place of the match? 
    }
}

我认为您需要使用match evaluator,并围绕正则表达式中的数字使用捕获组:

var regex = new Regex(@"#INT\[(\d+)-(\d+)\]");
//                            ^   ^ ^   ^
var res = regex.Replace("This is one of #INT[1-5] tests", m => 
            random.Next(Convert.ToInt32(m.Groups[1].Value), Convert.ToInt32(m.Groups[2].Value)).ToString());
结果:
这是2项测试中的一项
这是3项测试中的一项


捕获的文本可通过
m.Groups[n]访问.Value

@TimSchmelter感谢您指出这一点,尽管我知道这一点。为了简单起见,我刚刚初始化了循环中的随机数。我编辑了我的代码以避免出现问题。OP可能需要也可能不需要第二个值上的
+1
。应该注意的是,像“#INT[4-2]这样的输入将导致
Random引发异常。下一步
。非常感谢您的回答。它可以正常工作!@juharr:原始代码中也会出现同样的问题。问题中没有关于如何处理此类情况的线索。我假设这里有一些基本的错误处理。