使用正则表达式替换词典中的键的表情符号

时间:2015-09-30 13:31:16

标签: c# regex dictionary twitch

我找到了一个优雅的解决方案来解决我正在尝试执行的问题,即使用URL替换字符串中的表情(一旦我弄明白,它最终将成为img标记。此解决方案在此处找到:iterating over a dictionary of Regex in C#。我的问题是,当它重复已经受影响的内容块(输出)时,它会用http://替换带有表情网址的:/。

我从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;
}

编辑:对不起,我没有提供足够的信息;还有新发布在这里。因此,正如Twitch API所提供的正则表达式用于流光的表情。这是一个例子:Twitch API。这是一个提供表情的JSON字符串,每个表情都包含表情的正则表达式标识符和表情图像的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是regex,value是URL。使用上面提供的代码,它将{/ http://替换为:/的表情,因此在运行代码后,我最终得到以下内容:

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

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

1 个答案:

答案 0 :(得分:0)

因为正则表达式再次扫描整个字符串,所以我认为Regex.Replace解决方案最适合这里。

这是另一种选择;作为方法发布,欢迎提出更好的建议:)

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();
        }
    }
}

小免责声明:我还没有真正测试过它。