我需要一个字符串,并将其中的单词大写。某些单词(“in”,“at”等)不会大写,如果遇到则会更改为小写。第一个词应该总是大写。像“McFly”这样的姓氏不属于当前范围,因此相同的规则将适用于它们 - 只有首字母大写。
例如:“CNN的老鼠和男人”应改为“CNN的老鼠和男人”。 (因此ToTitleString在这里不起作用)
我想知道最好的方法是什么。 我想到的是用空格分割字符串,然后遍历每个单词,必要时更改它,并将其连接到前一个单词,依此类推。 看起来很天真,我想知道是否有更好的方法,使用.Net 3.5。
答案 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)
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);