英文标题大小写非常复杂,而且无法计算。这是事实。
你能得到的最好结果是一个程序,根据你喜欢的单词列表更改所有小写单词。但对于所有口语表达来说,这仍然是错误的。虽然扩展的变体列表可以捕捉其中许多,但有些仍然无法在没有语义分析的情况下确定。以下是两个例子:
- Running on/On Empty
- Working on/On a Building
后者确实可以从上下文中清楚地理解;前者则不行。虽然有明显的意义差异,但计算机无法决定哪一个是正确的。
(有时甚至人类也无法。我在 StackExchnge 论坛上询问了第一个例子,但没有得到可接受的答案。)
这里是我喜欢的替换列表;但一些四字词汇(无恶意)是个人选择。此外,有人可能会认为所有类型的数字,如any、all、few都应该大写。
这并不算优雅,事实上有点尴尬。但它对我来说很有效,所以我经常使用它,并且已经用它处理了超过10万个标题..。
public string ETC(string title)
{ // english title capitalization
if (title == null) return "";
string s = title.Trim().Replace('`', '\''); // change apo to tick mark
TextInfo UsaTextInfo = new CultureInfo("en-US", false).TextInfo;
s = UsaTextInfo.ToTitleCase(s); // caps for all words
// a list of exceptions one way or the other..
s = s.Replace(" A ", " a ");
s = s.Replace(" also ", " Also ");
s = s.Replace(" An ", " an ");
s = s.Replace(" And ", " and ");
s = s.Replace(" as ", " As ");
s = s.Replace(" At ", " at ");
s = s.Replace(" be ", " Be ");
s = s.Replace(" But ", " But ");
s = s.Replace(" By ", " by ");
s = s.Replace(" For ", " for ");
s = s.Replace(" From ", " from ");
s = s.Replace(" if ", " If ");
s = s.Replace(" In ", " in ");
s = s.Replace(" Into ", " into ");
s = s.Replace(" he ", " He ");
s = s.Replace(" has ", " Has ");
s = s.Replace(" had ", " Had ");
s = s.Replace(" is ", " Is ");
s = s.Replace(" my ", " My ");
s = s.Replace(" ", " "); // no triple spaces
s = s.Replace("'N'", "'n'"); // Rock 'n' Roll
s = s.Replace("'N'", "'n'"); // Rock 'n Roll
s = s.Replace(" no ", " No ");
s = s.Replace(" Nor ", " nor ");
s = s.Replace(" Not ", " not ");
s = s.Replace(" Of ", " of ");
s = s.Replace(" Off ", " off ");
s = s.Replace(" On ", " on ");
s = s.Replace(" Onto ", " onto ");
s = s.Replace(" Or ", " or ");
s = s.Replace(" O'c ", " O'C ");
s = s.Replace(" Over ", " over ");
s = s.Replace(" so ", " So ");
s = s.Replace(" To ", " to ");
s = s.Replace(" that ", " That ");
s = s.Replace(" this ", " This ");
s = s.Replace(" thus ", " Thus ");
s = s.Replace(" The ", " the ");
s = s.Replace(" Too ", " too ");
s = s.Replace(" when ", " When ");
s = s.Replace(" With ", " with ");
s = s.Replace(" Up ", " up ");
s = s.Replace(" Yet ", " yet ");
// a few(!) verbal expressions
s = s.Replace(" Get up ", " Get Up ");
s = s.Replace(" Give up ", " Give Up ");
s = s.Replace(" Givin' up ", " Givin' Up ");
s = s.Replace(" Grow up ", " Grow Up ");
s = s.Replace(" Hung up ", " Hung Up ");
s = s.Replace(" Make up ", " Make Up ");
s = s.Replace(" Wake Me up ", " Wake Me Up ");
s = s.Replace(" Mixed up ", " Mixed Up ");
s = s.Replace(" Shut up ", " Shut Up ");
s = s.Replace(" Stand up ", " Stand Up ");
s = s.Replace(" Wind up ", " Wind Up ");
s = s.Replace(" Wake up ", " Wake Up ");
s = s.Replace(" Come up ", " Come Up ");
s = s.Replace(" Working on ", " Working On ");
s = s.Replace(" Waiting on ", " Waiting On ");
s = s.Replace(" Turn on ", " Turn On ");
s = s.Replace(" Move on ", " Move On ");
s = s.Replace(" Keep on ", " Keep On ");
s = s.Replace(" Bring It on ", " Bring It On ");
s = s.Replace(" Hold on ", " Hold On ");
s = s.Replace(" Hang on ", " Hang On ");
s = s.Replace(" Go on ", " Go On ");
s = s.Replace(" Coming on ", " Coming On ");
s = s.Replace(" Come on ", " Come On ");
s = s.Replace(" Call on ", " Call On ");
s = s.Replace(" Trust in ", " Trust In ");
s = s.Replace(" Fell in ", " Fell In ");
s = s.Replace(" Falling in ", " Falling In ");
s = s.Replace(" Fall in ", " Fall In ");
s = s.Replace(" Faith in ", " Faith In ");
s = s.Replace(" Come in ", " Come In ");
s = s.Replace(" Believe in ", " Believe In ");
return s.Trim();
}
请注意,仍有许多规则不能这样实施。
一些基本规则并不难:大写第一个和最后一个单词。所有动词(
Is),形容词(
Red),代词(
He),名词(
Ace)和数字(
One),即使它们少于3(或4)个字母。
但是例外很难,例如:当介词是动词表达式的一部分时,不要大写介词...
示例1:“Working on/On a Building”-您必须知道这是一首福音歌曲才能决定它是“On”。
示例2:“Running On/on Empty”。可能意味着“Running On”或者“Running (with gas indictor) 'on Empty'”。
因此,最终您将不得不妥协。
minLength
实际上不够 min 了 ;) - Tim Schmelter