2010-11-30 38 views
16

我需要一個字符串,並在其中大寫字母。某些單詞(「in」,「at」等)不會大寫,如果遇到則更改爲小寫。第一個單詞應該總是大寫。像「McFly」這樣的姓氏不在當前範圍內,因此相同的規則將適用於他們 - 只有首字母大寫。在c中使用字符串大寫字母#

例如:「小鼠和人通過CNN的」應該「由CNN老鼠和人」改成。 (因此ToTitleString不會在這裏工作

我想知道什麼是最好的方式來做到這一點。 我想到的是用空格分割字符串,然後遍歷每個單詞,必要時更改它,並將它連接到前一個單詞,依此類推。 這似乎很天真,我想知道是否有更好的方式來使用.Net 3.5。

+1

什麼ToTitleString? – 2010-11-30 15:47:20

+0

程序應該如何理解CNN應該保持全部大寫? – 2010-11-30 15:48:43

+3

@Chris:我認爲他的意思是ToTitleCase ...?這裏請參閱http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx和'備註'爲什麼它不適用。 – 2010-11-30 15:49:25

回答

13

取決於你打算做資本我會用幼稚的方式去多久。你可以用一個正則表達式來做,但是你不想讓某些單詞大寫,這會讓你有點棘手。

編輯:

你可以用兩次傳球做使用正則表達式

var result = Regex.Replace("of mice and men isn't By CNN", @"\b(\w)", m => m.Value.ToUpper()); 
result = Regex.Replace(result, @"(\s(of|in|by|and)|\'[st])\b", m => m.Value.ToLower(), RegexOptions.IgnoreCase); 

此輸出Of Mice and Men Isn't by CNN

第一表達大寫在字邊界上每一個字母,第二個downcases匹配由空白所包圍的列表中的任何單詞。

的缺點這種方法是,你正在使用regexs(現在你有兩個問題),你需要不斷的排除詞列表保持最新狀態。我的正則表達式不夠好,無法用一種表達方式來完成,但它可能是可能的。

0

你應該像你描述的那樣創建你自己的函數。

0

最簡單的顯而易見的解決方案(英文句子)將是:

  • "sentence".Split(" ")上的空格字符句子
  • 循環每一個項目
  • 大寫每個項目的第一個字母 - item[i][0].ToUpper()
  • 重新回到連接在空間上的字符串中。
  • 用「。」重複此過程。和「,」使用該新字符串。
12

使用

Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase("of mice and men By CNN"); 

轉換爲適當的情況下,然後就可以通過關鍵字環路你所提到的。

1

您可以使用一個包含您想要忽略的詞語的詞典,將詞組拆分爲短語(.split(''))和每個短語,檢查短語是否存在於詞典中,如果不存在,大寫第一個字符,然後將字符串添加到字符串緩衝區。如果您正在處理的短語位於字典中,只需將其添加到字符串緩衝區即可。

0

,處理簡單的情況下,非聰明的做法:

var s = "of mice and men By CNN"; 
var sa = s.Split(' '); 
for (var i = 0; i < sa.Length; i++) 
    sa[i] = sa[i].Substring(0, 1).ToUpper() + sa[i].Substring(1); 
var sout = string.Join(" ", sa); 
Console.WriteLine(sout); 
3

爲什麼不使用ToTitleCase(),然後再繼續適用的詞彙列表,並Replace回那些適用的話全小寫形式(如果名單很小)。

適用單詞列表可以保存在字典中,並且非常有效地循環使用,取代.ToLower()等效項。

2

嘗試這樣:

public static string TitleCase(string input, params string[] dontCapitalize) { 
    var split = input.Split(' '); 
    for(int i = 0; i < split.Length; i++) 
     split[i] = i == 0 
      ? CapitalizeWord(split[i]) 
      : dontCapitalize.Contains(split[i]) 
      ? split[i] 
      : CapitalizeWord(split[i]); 
    return string.Join(" ", split); 
} 
public static string CapitalizeWord(string word) 
{ 
    return char.ToUpper(word[0]) + word.Substring(1); 
} 

,如果你需要處理複雜的姓氏,您可以在以後更新的CapitalizeWord方法。 添加這些方法的類,並使用它像這樣:

SomeClass.TitleCase("a test is a sentence", "is", "a"); // returns "A Test is a Sentence" 
5

下面是回答How to Capitalize names

CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture; 
TextInfo textInfo = cultureInfo.TextInfo; 

Console.WriteLine(textInfo.ToTitleCase(title)); 
Console.WriteLine(textInfo.ToLower(title)); 
Console.WriteLine(textInfo.ToUpper(title)); 
1

上jonnii的回答略有改善:

var result = Regex.Replace(s.Trim(), @"\b(\w)", m => m.Value.ToUpper()); 
     result = Regex.Replace(result, @"\s(of|in|by|and)\s", m => m.Value.ToLower(), RegexOptions.IgnoreCase); 
     result = result.Replace("'S", "'s"); 
相關問題