使用正则表达式替换字典中的键

本文关键字:字典 替换 正则表达式 | 更新日期: 2023-09-27 18:15:13

我找到了一个优雅的解决方案,我试图执行,这是替换表情符号在字符串与URL(它将最终成为一个img标签,一旦我弄清楚这一点。这个解决方案是在这里找到的:在c#中迭代一个正则表达式字典。我的问题是,当它在已经受影响的内容块(输出)上重复时,它将http://中的:/替换为远程URL。

我得到我的表情从Twitch API,它提供了一个正则表达式为每个表情和一个URL的图像。

我想替换我的字典中的所有表情,而不覆盖url中包含的实例。这可能吗?我原以为这将是一个简单的努力,但它最终超出了我的知识范围。

public static string Replacements(string text)
{
    string output = text;
    foreach (KeyValuePair<string, string> item in dict1)
    {
        //here replace output again
        output = Regex.Replace(output, item.Key, item.Value); 
    }

    return output;
}

编辑:对不起,我没有给足够的信息;仍然是新的张贴在这里。所以Regexes是从Twitch API获取流媒体的表情。举个例子:Twitch API。这是一个JSON字符串,提供emote,每个emote包含一个emote的Regex标识符和一个emote图像的URL。

"emoticons":[
    {"width":24,"height":18,"regex":"'':-?D","state":"active","subscriber_only":false,"url":"http://static-cdn.jtvnw.net/jtv_user_pictures/chansub-global-emoticon-9f2ac5d4b53913d7-24x18.png"}
    {"width":24,"height":18,"regex":"'':-?[''''/]","state":"active","subscriber_only":false,"url":"http://static-cdn.jtvnw.net/jtv_user_pictures/chansub-global-emoticon-374120835234cb29-24x18.png"}
...]

我拔出只是正则表达式和URL的图像到一个字典;key是正则表达式,value是URL。使用上面提供的代码,它将http://中的:/替换为:/的emote,因此在运行代码之后,我最终得到以下内容:

httphttp://static-cdn.jtvnw.net/jtv_user_pictures/chansub-global-emoticon-374120835234cb29-24x18.png/static-cdn.jtvnw.net/jtv_user_pictures/chansub-global-emoticon-9f2ac5d4b53913d7-24x18.png

我希望这更能澄清我的困境。

使用正则表达式替换字典中的键

因为Regex再次扫描整个字符串,我不认为Regex。替换方案最适合这里。

这是另一个选项;作为方法发布,欢迎更好的建议:)

public string ReplaceMethod(string input, Dictionary<string,string> dict1 )
{
    if (dict1.Any(c => string.IsNullOrEmpty(c.Key)))
                throw new ArgumentException("dictionary may not contain empty key's");
    StringBuilder output = new StringBuilder();
    //loop the string's characters
    for (int c = 0; c < input.Length; c++)
    {
       bool found = false;
       //order by length desc to ensure longest possible match is checked first
       foreach (KeyValuePair<string, string> item in
                                      dict1.OrderByDescending(x => x.Key.Length))
       {
           if (input.Substring(c).StartsWith(item.Key))
           {
               //match found
               found = true;
               //skip length of the key
               c+=item.Key.Length - 1;
               output.Append(item.Value);
               break;
            }
        }
        if (!found)
            output.Append(input[c]);
    }
    return output.ToString();
}

作为控制台应用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication6
{
    class Program
    {   
        public static string ReplaceMethod(string input, //... as above
                                             Dictionary<string,string> dict1) 
        static void Main(string[] args)
        {
            var dict1 = new Dictionary<string, string>();
            dict1.Add(":-)", "***http://smile.jpg***");
            dict1.Add(":/", "***http://hmmm.jpg***");
            dict1.Add(":(", "***http://sad.jpg***");
            dict1.Add("):(", "***http://strange? :)***");
            string input = ":-) This is just a quick solution:-" +
                           "Suggestions are welcome  :/  :( :)):(";
            string output = ReplaceMethod(input, dict1);
            Console.WriteLine("input");
            Console.WriteLine(input);
            Console.WriteLine();
            Console.WriteLine("output");            
            Console.WriteLine(output);
            Console.ReadLine();
        }
    }
}

小小的声明:我还没有真正测试过