在字符串集合中查找最相同的字符串
本文关键字:字符串 查找 集合 | 更新日期: 2023-09-27 18:34:02
我有一个包含所有系统字体名称的列表。以下是列表的一部分:
Arial
Calibri
Times New Roman
我的问题是:我有 16 个 ASCII 字符(2 个字节)的字体名称,字体(粗体、斜体、常规)
Calibri Bold
Arial Bold Itali
Times New Roman
如果我有一个字符串(例如 Arial 粗体意大利),如何从列表中获取字体名称(例如 Arial)
希望有人能帮助我或给我建议。
答:反之亦然。打赌这可以让我做得更有效率,但它现在有效。
foreach (string fn in FontHelper.FontNames)
{
if (Font.FontName.Contains(fn))
{
fontname = fn;
break;
}
}
您可以尝试使用Levenshtein距离。找到大多数相同的字符串是一件好事。在这里你可以阅读它,你也可以找到一些算法来找到那个距离。
您可以使用 .contains() 方法
string str = "Arial Bold Itali";
if(str.contains("Arial"))
{
return str;
}
我认为
你也可以使用 start with。
string str = "Arial Bold Itali";
if(str.StrartWith("Arial"))
{
return str;
}
我的建议是在进行匹配之前去除字体修饰符。我假设字体只能有几种不同类型的修饰符。
var fontToFind = "Arial Bold Itali";
fontToFind = fontToFind.Replace("Bold", "").Replace("Itali", "").Trim();
//Do search
假设"最相同"意味着一个是另一个的前缀,你可以做这样的事情:
var fonts = new[] { "Arial", "Calibri", "Times New Roman" };
var input = new[] { "Calibri Bold", "Arial Bold Itali", "Times New Roman" };
var result = input.Select(item => fonts.Single(font => item.StartsWith(font)));
// result == { "Calibri", "Arial", "Times New Roman" }
你需要某种启发式的——例如,去掉任何"粗体"和"斜体"后缀(我真的不知道还能遇到什么)。
这可以通过正则表达式来完成:
var str = "Arial Bold Italic";
var fontName = Regex.Replace(str, "((Bold|Italic)''s*)*$", String.Empty);
看到它的实际效果。
另外,您可以非常轻松地扩展它以去除更多后缀,例如"倾斜"。