You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C#正则表达式替换模板关键词的代码测试问题

解决模板关键词替换的正则方案

嘿,我来帮你把这个模板替换的问题搞定!你已经有了一个不错的开头,不过咱们可以把正则和替换逻辑优化得更稳定好用。

首先看你写的正则(?<=\{{2})[^}}]*(?=\}{2}),其实思路是对的,但可以调整得更严谨——比如换成(?<=\{{2})([^{}]+)(?=\}{2}),这样能确保只匹配{{和}}之间不包含大括号的内容,避免意外匹配到嵌套或者无效的格式。

接下来给你完整的可运行代码,用Regex.Replace的MatchEvaluator重载来动态从字典里取值替换,还能处理字典里没有的关键词(保留原格式避免出错):

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

class TemplateReplacer
{
    static void Main()
    {
        string input = "Welcome {{friend}} Get my new {{id}} with {{anonymous}} People";
        Dictionary<string, string> mydict = new Dictionary<string, string>();
        mydict.Add("friend", "<<My Friend>>");
        mydict.Add("id", "<<Your ID>>");
        
        // 优化后的正则:精准匹配{{关键词}}中的关键词部分
        string pattern = @"(?<=\{{2})([^{}]+)(?=\}{2})";
        
        // 用MatchEvaluator处理每个匹配项
        string result = Regex.Replace(input, pattern, match => 
        {
            string key = match.Groups[1].Value.Trim(); // 顺便处理关键词前后的空格(如果有的话)
            if (mydict.TryGetValue(key, out string value))
            {
                return value;
            }
            // 如果字典里没有这个关键词,保留原{{key}}格式
            return $"{{{{{key}}}}}";
        });
        
        Console.WriteLine(result);
        // 输出:Welcome <<My Friend>> Get my new <<Your ID>> with {{anonymous}} People
    }
}

几个关键点说明:

  • 正则表达式:(?<=\{{2})是正向预查,确保前面是两个{;([^{}]+)捕获中间的有效关键词(非大括号字符);(?=\}{2})是正向预查,确保后面是两个}。这样不会把{{和}}本身包含在匹配结果里,直接拿到关键词。
  • MatchEvaluator的优势:比起简单的替换,它能让我们对每个匹配项做逻辑处理——比如这里的TryGetValue避免了键不存在时的报错,还能保留原模板格式,非常实用。
  • 避开你之前的坑:你注释掉的那些正则比如@"\{{2}^(.*?)$\}{2}"是错的,因为^和$是行首尾匹配符,而你的模板是一行里多个关键词,根本匹配不到;"^[{{\\w}}]$"则是匹配单个字符,完全不符合需求。

内容的提问来源于stack exchange,提问作者Marks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:56:09