2012-05-11 18 views
0

すべてのシステムフォント名を持つリストがあります。文字列コレクション内で最も同一の文字列を見つける

Arial 
Calibri 
Times New Roman 

私の問題がある:私はfontfaceとフォント名の16個のASCII文字(2バイト)を持っている(太字、斜体、正規)

Calibri Bold 
Arial Bold Itali 
Times New Roman 

どのようにすることができますここではリストの一部は、文字列(Arial Bold Italiなど)がある場合、リストからfontname(Arial)を取得します

誰かが私に助けてくれると助かります。

回答: 私は逆でした。これは私がより効率的に行うことができますが、それは今のところ動作します。あなたが.contains()方法

string str = "Arial Bold Itali"; 

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

なぜこれらのコンマを区切りますか? –

+0

この記事では、多くのオプションを比較しています:http://www.cs.cmu.edu/~pradeepr/papers/ijcai03.pdf – Dan

答えて

1

私はstart withを使うこともできると思います。

string str = "Arial Bold Itali"; 

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

、ストリップアウトするフォント修飾子を、あなたのマッチングを行う前になります。私はフォントが持つことができる修飾語のいくつかの異なる種類があると仮定します。

var fontToFind = "Arial Bold Itali"; 

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

//Do search 
+0

私は彼が 'Arial'を手前で知っているとは思っていません。すべてのフォント名 – V4Vendetta

+2

逆の場合:*文字列(Arial Bold Italiなど)がある場合は、リストからフォント名(例:Arial)を取得するにはどうしたらいいですか? –

+0

私はこのFontNames.Where(x => x.Contains(Font.FontName))を試しました。ここでFontNamesは私のフォント名(Arial)とFont.FontNameのリストです(Arial Bold Itali) – janseeuw

1

に私のアドバイスを使用することができます

foreach (string fn in FontHelper.FontNames) 
     { 
      if (Font.FontName.Contains(fn)) 
      { 
      fontname = fn; 
      break; 
      } 
     } 
+0

十分ではないかもしれません。フォントフェース名に "Bold"という部分文字列が含まれている場合はどうなりますか? – Jon

3

Levenshtein距離を使用できます。ほとんどの同一の文字列を見つけるのは良いことです。 hereあなたはそれについて読むことができる、また、あなたはその距離を見つけるためにいくつかのアルゴリズムを見つけることができます。 - どんな「太字」を取り去る、例えば

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

「Italic」という接尾辞(私は本当に他に何が遭遇するかはわかりません)。

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

See it in action:正規表現で行うことができます

さらに、これを拡張して、「斜体」などのサフィックスを削除することもできます。

1

あなたはヒューリスティックのいくつかの並べ替えを必要とする:「ほとんど同じ」とは、一方が他方の接頭辞であることを意味し、あなたがこのような何かを行うことができますと仮定

+0

こんにちは、ありがとうございました。ストライプ「ボールド」、「イタリック」、...非常に簡単には動作しません。私は16文字しか持っていませんが、ほとんどの場合xxxxxxxxxxxxxボー、xxxxxxxxxxxx Itaで終わります。フォント名が16文字を超えると、フォントのフルネームは表示されません。 – janseeuw

+0

@Wixon:正規表現をもっと複雑にするのはどうですか?[例](http://ideone.com/HEBK1)。 – Jon

関連する問題