我有一个包含所有系统字体名称的列表。以下是列表的一部分:
Arial
Calibri
Times New Roman
我的问题是:我有16个ASCII字符(2个字节)的fontname字体(粗体,斜体,常规)
Calibri Bold
Arial Bold Itali
Times New Roman
如果我有一个字符串(例如Arial Bold Itali),如何从列表中获取字体名称(例如Arial)
希望有人可以帮助我或给我建议。
答案: 我做了反之亦然。打赌这可以让我更有效率,但它现在有效。
foreach (string fn in FontHelper.FontNames)
{
if (Font.FontName.Contains(fn))
{
fontname = fn;
break;
}
}
答案 0 :(得分:3)
您可以尝试使用Levenshtein距离。找到大多数相同的字符串是件好事。 here你可以阅读它,你也可以找到一些算法来找到那个距离。
答案 1 :(得分:2)
您可以使用.contains()方法
string str = "Arial Bold Itali";
if(str.contains("Arial"))
{
return str;
}
答案 2 :(得分:1)
我的建议是,在进行匹配之前去掉字体修饰符。我假设字体只有几种不同的修饰符。
var fontToFind = "Arial Bold Itali";
fontToFind = fontToFind.Replace("Bold", "").Replace("Itali", "").Trim();
//Do search
答案 3 :(得分:1)
假设“最相同”意味着一个是另一个的前缀,你可以这样做:
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" }
答案 4 :(得分:1)
你需要某种启发式方法 - 例如,删除任何“Bold”和“Italic”后缀(我真的不知道还能遇到什么)。
可以使用正则表达式完成:
var str = "Arial Bold Italic";
var fontName = Regex.Replace(str, "((Bold|Italic)\\s*)*$", String.Empty);
<强> See it in action 强>
另外,您可以非常轻松地扩展它以去除更多后缀,例如“Oblique”。
答案 5 :(得分:1)
我认为你也可以使用开头。
string str = "Arial Bold Itali";
if(str.StrartWith("Arial"))
{
return str;
}