使用正则表达式替换字典中的键
本文关键字:字典 替换 正则表达式 | 更新日期: 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();
}
}
}
小小的声明:我还没有真正测试过