我找到了一个优雅的解决方案来解决我正在尝试执行的问题,即使用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
我希望这更能澄清我的困境。
答案 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();
}
}
}
小免责声明:我还没有真正测试过它。