RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 846489
Accepted
nick_n_a
nick_n_a
Asked:2020-06-25 21:14:22 +0000 UTC2020-06-25 21:14:22 +0000 UTC 2020-06-25 21:14:22 +0000 UTC

c# 中有 preg_replace 的类似物吗?

  • 772

有一个“模板词”数组。从数据库中读取模式(模式)后,是否有可能将“模板词”自动替换为必要的词。例如

“您好 %client%。您的订单 %order% 将于 %date% 交付”。

好吧,Dictionary<string,string>例如,如果有一个数组,或者如果有两个数组 - 替换什么,替换什么。那些。内置模板引擎。

或者……至少……通过正则表达式来做,或者有一个更短的解决方案。

c#
  • 5 5 个回答
  • 10 Views

5 个回答

  • Voted
  1. tym32167
    2020-06-25T21:48:53Z2020-06-25T21:48:53Z

    简单示例

    var pattern = "%1% - %2% - %3%";
    var dict = new Dictionary<string, string>() {{"%1%","odin"}, {"%2%","dwa"}, {"%3%","tri"}};
    
    var res = dict.Aggregate(pattern, (acc, p)=>acc.Replace(p.Key, p.Value));
    
    Console.WriteLine(res); 
    

    结论

    odin - dwa - tri
    
    • 4
  2. tym32167
    2020-06-25T22:08:47Z2020-06-25T22:08:47Z

    既然这样的酒没了,我就加点蒙昧

    public string Format<T>(string source, T data)
    {
        var res = source;
        foreach (var p in typeof(T).GetProperties())
            res = res.Replace($"%{p.Name}%", p.GetValue(data)?.ToString()); 
        return res;
    }
    
    var pattern = "%name% - %date% - %age%";
    Console.WriteLine(Format(pattern, new {name = "vasya", date = DateTime.Now, age = 18}));
    

    结论

    vasya - 25-Jun-18 16:06:20 - 18
    
    • 3
  3. Pavel Mayorov
    2020-06-25T22:00:43Z2020-06-25T22:00:43Z

    最简单的方法是string.Format:

    var template = "Здравствуйте {0}. Ваш заказ {1} будет доставлен {2:dd.MM.yyyy}";
    string.Format(template, "Вася", "фиговина", DateTime.Today);
    

    如果需要,很容易按名称选择参数:

    var template = "Здравствуйте {0:client}. Ваш заказ {0:order} будет доставлен {0:date:dd.MM.yyyy}";
    string.Format(template, new CompositeFormattable(new
    {
        client = "Вася",
        order = "фиговина",
        date = DateTime.Today,
    }));
    
    // ...
    
    class CompositeFormattable : IFormattable
    {
        private readonly object obj;
        public CompositeFormattable(object obj)
        {
            this.obj = obj;
        }
    
        public string ToString(string format, IFormatProvider provider)
        {
            var index = format.IndexOf(':');
            string propname;
            if (index >= 0)
            {
                propname = format.Substring(0, index);
                format = format.Substring(index + 1);
            }
            else
            {
                propname = format;
                format = null;
            }
    
            var value = obj.GetType().GetProperty(propname).GetValue(obj);
            if (value == null)
                return null;
    
            var formattableValue = value as IFormattable;
            if (formattableValue != null)
                return formattableValue.ToString(format, provider);
            else
                return value.ToString();
        }
    }
    

    通过正则表达式的变体也是可能的(Regex.Replace 方法)。

    • 2
  4. Best Answer
    Андрей NOP
    2020-07-03T14:07:53Z2020-07-03T14:07:53Z

    奇怪的是最后没有人提出关于正则表达式的变体,它似乎并不复杂:

    var template = "Здравствуйте, %client%! Ваш заказ %order% будет доставлен %date%.";
    var pattern = "%.*?%";
    var dict = new Dictionary<string, string>
    {
        ["%client%"] = "Иван Иванович",
        ["%order%"] = "№007",
        ["%date%"] = "сегодня"
    };
    string evaluator(Match match) => dict.TryGetValue(match.Value, out var replacement) ? replacement : "n/a";
    var result = Regex.Replace(template, pattern, evaluator);
    Console.WriteLine(result);
    

    如果您不想将所有这些都保留在字典%中,您可以搜索 not match.Value,但是match.Value.Trim('%')

    • 2
  5. Bulson
    2020-06-25T21:57:30Z2020-06-25T21:57:30Z

    我是这样做的,尽管可能不是最理想的方式。

    string textInput = "Здраствуйте %client%. Ваш заказ %order% будет доставлен %date%";
    Dictionary<string, string> masks = new Dictionary<string, string>
    {
        { "%client%", "Иванов" },
        { "%order%", "Заказ №123" },
        { "%date%", "2 апреля 23:05" },
    };
    
    var query = (from s in textInput.Split(' ')
                 from m in masks
                 select s.Replace(m.Key, m.Value) into r
                 where !r.StartsWith("%")
                 select r).Distinct();
    
    
    string result = String.Join(" ", query);
    
    • -2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5