2010-11-30 41 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"); 
相关问题