0

我有一个包含所有系统字体名称的列表。这是列表的一部分:

Arial
Calibri
Times New Roman

我的问题是:我有 16 个 ASCII 字符(2 个字节)的字体名称和字体(粗体、斜体、常规)

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;
          }
        }
4

6 回答 6

3

您可以尝试使用 Levenshtein 距离。找到大多数相同的字符串是一件好事。在这里你可以阅读它,你也可以找到一些算法来找到那个距离。

于 2012-05-11T09:15:20.313 回答
2

您可以使用.contains()方法

string str = "Arial Bold Itali";

if(str.contains("Arial"))
{
   return str;
}
于 2012-05-11T09:13:41.393 回答
1

我的建议是在进行匹配之前去掉字体修饰符。我认为只有几种不同类型的修饰符字体可以有。

var fontToFind = "Arial Bold Itali";

fontToFind = fontToFind.Replace("Bold", "").Replace("Itali", "").Trim();

//Do search
于 2012-05-11T09:14:44.840 回答
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" }
于 2012-05-11T09:15:41.860 回答
1

您需要某种启发式方法——例如,去掉任何“粗体”和“斜体”后缀(我真的不知道还会遇到什么)。

这可以通过正则表达式来完成:

var str = "Arial Bold Italic";
var fontName = Regex.Replace(str, "((Bold|Italic)\\s*)*$", String.Empty);

看到它在行动

另外,您可以很容易地扩展它以去除更多后缀,例如“Oblique”。

于 2012-05-11T09:16:13.427 回答
1

我想你也可以使用 start with。

string str = "Arial Bold Itali";

if(str.StrartWith("Arial"))
{
   return str;
}
于 2012-05-11T09:16:31.180 回答