2012-05-11 190 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

相關問題