使用c#在字符串中大写单词

时间:2010-11-30 15:45:30

标签: c# string capitalization

我需要一个字符串,并将其中的单词大写。某些单词(“in”,“at”等)不会大写,如果遇到则会更改为小写。第一个词应该总是大写。像“McFly”这样的姓氏不属于当前范围,因此相同的规则将适用于它们 - 只有首字母大写。

例如:“CNN的老鼠和男人”应改为“CNN的老鼠和男人”。 (因此ToTitleString在这里不起作用

我想知道最好的方法是什么。 我想到的是用空格分割字符串,然后遍历每个单词,必要时更改它,并将其连接到前一个单词,依此类推。 看起来很天真,我想知道是否有更好的方法,使用.Net 3.5。

10 个答案:

答案 0 :(得分:15)

根据您计划进行大写的频率,我会采用天真的方法。你可以用正则表达式来做,但事实上你不希望某些单词大写,这使得这有点棘手。

编辑:

你可以使用正则表达式进行两次传递

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

第一个表达式将单词边界上的每个字母大写,第二个表达式下调与列表中与空格包围的任何单词。

这种方法的缺点是你正在使用正则表达式(现在你有两个问题),你需要保持排除的单词列表是最新的。我的正则表达式不足以能够在一个表达式中完成它,但它可能是可能的。

答案 1 :(得分:15)

使用

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

转换为正确的大小写,然后您可以按照提到的方式遍历关键字。

答案 2 :(得分:6)

以下是答案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));

答案 3 :(得分:3)

为什么不首先使用ToTitleCase(),然后将适用的单词列表和Replace保留回那些适用单词的全小写版本(前提是列表很小)。

适用的单词列表可以保存在字典中,并且非常有效地循环,替换为.ToLower()等效字。

答案 4 :(得分: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 :(得分:1)

您可以使用包含您要忽略的单词的词典,将短语(.split(''))中的句子分开,并为每个短语检查词组中是否存在该短语,如果不存在,则将其大写第一个字符然后,将字符串添加到字符串缓冲区。如果您当前正在处理的短语在字典中,只需将其添加到字符串缓冲区。

答案 6 :(得分: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");

答案 7 :(得分:0)

您应该像描述一样创建自己的函数。

答案 8 :(得分:0)

最简单的解决方案(对于英语句子)将是:

  • "sentence".Split(" ")关于空格字符的句子
  • 遍历每个项目
  • 将每个项目的第一个字母大写 - item[i][0].ToUpper()
  • 重新回到连接在空格上的字符串。
  • 用“。”重复此过程。和“,”使用那个新字符串。

答案 9 :(得分: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);