在字符串集合中查找最相同的字符串

本文关键字:字符串 查找 集合 | 更新日期: 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);

看到它的实际效果

另外,您可以非常轻松地扩展它以去除更多后缀,例如"倾斜"。