2012-05-11 132 views
0

我有一个包含所有系统字体名称的列表。这里是清单的一部分:查找字符串集合中最相同的字符串

Arial 
Calibri 
Times New Roman 

我的问题是:我的字体名的16个ASCII字符(2个字节)与fontface(粗体,斜体,普通)

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

你为什么不把这些逗号分开? –

+0

本文比较了很多选项:http://www.cs.cmu.edu/~pradeepr/papers/ijcai03.pdf – Dan

回答

1

我想你也可以用start。

string str = "Arial Bold Itali"; 

if(str.StrartWith("Arial")) 
{ 
    return str; 
} 
2

可以使用.contains()方法

string str = "Arial Bold Itali"; 

if(str.contains("Arial")) 
{ 
    return str; 
} 
+0

我不认为他手上有'Arial'知道。每个字体名称 – V4Vendetta

+2

情况反之亦然:*如果我有一个字符串(例如Arial Bold Itali)*,如何从列表中获取fontname(ex。Arial)。 –

+0

我试过这个FontNames.Where(x => x.Contains(Font.FontName))。First();其中FontNames是我的字体名称列表(Arial)和Font.FontName是(Arial Bold Itali) – janseeuw

1

我的建议,会是你做你的匹配前剥离出的字体修饰。我认为只有几种不同的修饰符字体可以具有。

var fontToFind = "Arial Bold Itali"; 

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

//Do search 
+0

可能不够好。如果字体名称包含子字符串“Bold”会怎么样? – Jon

3

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

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" } 
1

你需要某种启发的 - 例如,剥离出任何“大胆”和“斜体”后缀(我不知道还能遇到什么)。

,可以用正则表达式来完成:

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

See it in action

另外,你可以非常容易地扩展它来去除更多的后缀,如“斜”。

+0

嗨,谢谢你的回答。条纹“粗体”,“斜体”......不能很容易地工作。我只有16个字符,大多数时候我最终与xxxxxxxxxxxxx Bo,xxxxxxxxxxxx Ita。当字体名超过16个字符时,我没有完整的字体名称。 – janseeuw

+0

@Wixon:好的,如何让正则表达式更多地参与?[例子](http://ideone.com/HEBK1)。 – Jon

相关问题