c# - 用值替换字符串中的给定模式

原文 标签 c# regex

给定具有这种格式的文件

// Colour
$primary-colour: if(@Model.PrimaryColour, @primaryColour, #afd05c);
$secondary-colour: if(@secondaryColour, @secondaryColour, #323f47);
// and so on


我正在尝试替换@Model。基于字典的任何内容都是这样的

var dictionary = new Dictionary<string, string>
{
    {"primaryColour", "blue"},
    {"secondaryColour", "red"}
};


但是我正在努力寻找一种方法。

我正在考虑做这样的事情:

private static String Replace(String str)
{
    var dictionary = new Dictionary<string, string>
    {
        {"primaryColour", "blue"},
        {"secondaryColour", "red"}
    };

    string variableValue;
    string pattern = @"@Model.(?<name>\w)";
    dictionary.TryGetValue(FirstCharacterToLower("${name}"), out variableValue);
    var replacePattern = String.Format("{0}", variableValue);
    return Regex.Replace(str, pattern, replacePattern, RegexOptions.IgnoreCase);
}

private static string FirstCharacterToLower(string str)
{
    Console.WriteLine(str);
    if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0))
        return str;

    return Char.ToLowerInvariant(str[0]) + str.Substring(1);
}


但是我传递给FirstCharacterToLower的只是一个字符串{name},我被卡在那里。想不到做到这一点的方法。

知道从这里去哪里吗?

谢谢

编辑:基于sln评论我做了这个,它的工作原理

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

public class Program
{
    public static void Main()
    {

        var input = @"
            // Colour
            $primary-colour: if(@Model.PrimaryColour, @Model.PrimaryColour, #afd05c);
            $secondary-colour: if(@Model.SecondaryColour, @Model.SecondaryColour, #323f47);";

        Console.WriteLine(Replace(input));
    }

    private static String Replace(String str)
    {
        var dictionary = new Dictionary<string, string>
        {
            {"primaryColour", "blue"},
            {"secondaryColour", "red"}
        };

        var regex = new Regex(@"@Model\.(?<name>\w+)");

        var output = regex.Replace(str, v => 
            {
                string outVariable;
                dictionary.TryGetValue(GetNameOfVariable(v.Groups["name"].Value), out outVariable);
                return outVariable;
            });

        return output;
    }

    private static string GetNameOfVariable(string str)
    {
        Console.WriteLine(str);
        if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0))
            return str;

        return Char.ToLowerInvariant(str[0]) + str.Substring(1);
    }
}

最佳答案

就像@sln告诉的那样,您必须使用委托。

private static String Replace(String str)
{
    var dictionary = new Dictionary<string, string>
    {
        {"primaryColour", "blue"},
        {"secondaryColour", "red"}
    };

    string pattern = @"@Model\.(?<name>\w+)";
    return Regex.Replace(str, pattern, m => 
        {
            string key = m.Groups["name"].Value;
            key = FirstCharacterToLower(key);
            string value = null;
            if (dictionary.TryGetValue(key, out value))
                return value;
            else
                return m.Value;
        });
}

相关文章:

c# - 为什么通过反射查询程序集的类型会导致程序在调试时意外挂起?

c# - 如何编写C#正则表达式以确保字符串以一个字符开头,后跟6位数字

regex - 这个正则表达式是什么意思?

mysql - MySQL REGEXP不忽略连字符

c# - 设置列值时出现StrongTypingException

c# - Azure服务总线AutoDeleteOnIdle

c# - 与JScript的新ActiveXObject等效的C#

c# - 运算符<<不能应用于long和long类型的操作数

regex - 嵌入式,便携式解析

regex - 正则表达式以匹配字母字符串,并且至少需要一个大写字母和一个小写字母(vb.net)