C# 麦当劳在C中加上字母#
如何将名称转换为C#中的大小写 我有一份名单,我想证明一下C# 麦当劳在C中加上字母#,c#,string,C#,String,如何将名称转换为C#中的大小写 我有一份名单,我想证明一下 例如:麦当劳到麦当劳或奥布莱恩到奥布莱恩。这是一个有趣的问题。我认为没有现成的解决方案 我已将以下文章加入书签,这篇文章可能与您想要的内容非常接近: 我还没有尝试过这些代码,这个解决方案几乎需要手动处理所有情况。但是这只是一个开始,也许你会发现它很有用。计算机绝对不可能仅仅神奇地知道“麦当劳”中的第一个“D”应该大写。因此,我认为有两种选择 有人可能有一个软件或一个库,可以为你做这件事 除此之外,您唯一的选择是采取以下方法:首先,我会
例如:麦当劳到麦当劳或奥布莱恩到奥布莱恩。这是一个有趣的问题。我认为没有现成的解决方案 我已将以下文章加入书签,这篇文章可能与您想要的内容非常接近:
我还没有尝试过这些代码,这个解决方案几乎需要手动处理所有情况。但是这只是一个开始,也许你会发现它很有用。计算机绝对不可能仅仅神奇地知道“麦当劳”中的第一个“D”应该大写。因此,我认为有两种选择
其中最困难的部分是确定资本化的算法。字符串操作本身非常简单。没有一个完美的方法,因为没有案例的“规则”。一种策略可能是一组规则,例如“将第一个字母大写…通常”和“如果前两个字母是mc,则将第三个字母大写…通常” 从一本真名词典开始,并将它们与你自己的名字进行比较,寻找匹配项,这会有所帮助。您还可以获取一个实名词典,从中生成一个Markhov链,并在Markhov链上抛出任何新名称以确定大小写。这是一个疯狂而复杂的解决方案
最终的完美解决方案是使用人工更正数据。这样做需要您的程序能够在一定程度上解释英语。至少能把一个字符串分解成一组单词。Net框架中没有内置的API可以实现这一点 但是,如果有,您可以使用以下代码
public string ProperCase(string str, Func<string,bool> isWord) {
var word = new StringBuilder();
var cur = new StringBuilder();
for ( var i = 0; i < str.Length; i++ ) {
cur.Append(cur.Length == 0 ? Char.ToUpper(str[i]) : str[i]));
if ( isWord(cur.ToString()) {
word.Append(cur.ToString());
cur.Length = 0;
}
}
if ( cur.Length > 0 ) {
word.Append(cur);
}
return word.ToString();
}
publicstringpropercase(stringstr,Func-isWord){
var word=新的StringBuilder();
var cur=新的StringBuilder();
对于(变量i=0;i0){
附加词(cur);
}
返回word.ToString();
}
这不是一个完美的解决方案,但它给了你一个大致的思路:
> P>你可以考虑使用一个搜索引擎来帮助你。提交一个查询,看看结果如何大写这个名字。 < p>我写了以下扩展方法。请随意使用。< /P>public static class StringExtensions
{
public static string ToProperCase( this string original )
{
if( original.IsNullOrEmpty() )
return original;
string result = _properNameRx.Replace( original.ToLower( CultureInfo.CurrentCulture ), HandleWord );
return result;
}
public static string WordToProperCase( this string word )
{
if( word.IsNullOrEmpty() )
return word;
if( word.Length > 1 )
return Char.ToUpper( word[0], CultureInfo.CurrentCulture ) + word.Substring( 1 );
return word.ToUpper( CultureInfo.CurrentCulture );
}
private static readonly Regex _properNameRx = new Regex( @"\b(\w+)\b" );
private static readonly string[] _prefixes = { "mc" };
private static string HandleWord( Match m )
{
string word = m.Groups[1].Value;
foreach( string prefix in _prefixes )
{
if( word.StartsWith( prefix, StringComparison.CurrentCultureIgnoreCase ) )
return prefix.WordToProperCase() + word.Substring( prefix.Length ).WordToProperCase();
}
return word.WordToProperCase();
}
}
您可以根据具有正确大小写的字典(文件)检查小写/混合大写姓氏,然后从字典返回“real”值
我用谷歌快速搜索了一下,看看是否有,但没有用!我正计划编写这样一个函数,但可能不会涉及太多的边缘情况…下面用psuedo代码与regex进行匹配
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
string txt = textInfo.ToTitleCase("texthere");
以/\b[A-Z]+\b/作为集合匹配开始,这样每个字母序列在单词边界上作为集合匹配
if the string is all uppercase...
lower-case the string
upper-case the first letter
do the following beginning of string replacements
Vanb -> VanB
Vanh -> VanH
Mc? -> Mc? (uppercase wildcard character)
Mac[^kh] -> Mac? (uppercase wildcard match)
使用替换的全名字符串与其他替换集进行匹配,如
"De La " -> "de la "
这应该特别适用于名称的大多数情况……但是一个很好的通用名称大小写数据库将非常好。这是我的解决方案。这将名称硬编码到程序中,但只需一点工作,您就可以在程序外保留一个文本文件,读取名称异常(即Van、Mc、Mac)并循环通过它们
public static String toProperName(String name)
{
if (name != null)
{
if (name.Length >= 2 && name.ToLower().Substring(0, 2) == "mc") // Changes mcdonald to "McDonald"
return "Mc" + Regex.Replace(name.ToLower().Substring(2), @"\b[a-z]", m => m.Value.ToUpper());
if (name.Length >= 3 && name.ToLower().Substring(0, 3) == "van") // Changes vanwinkle to "VanWinkle"
return "Van" + Regex.Replace(name.ToLower().Substring(3), @"\b[a-z]", m => m.Value.ToUpper());
return Regex.Replace(name.ToLower(), @"\b[a-z]", m => m.Value.ToUpper()); // Changes to title case but also fixes
// appostrophes like O'HARE or o'hare to O'Hare
}
return "";
}
手动处理案例是我所知道的唯一方法。我们有一个内部库,它可以做几乎相同的事情(最终我们不得不不时地添加新的怪癖)。Doh,刚刚注意到Gregory用额外的(有用的)语言说了同样的事情观察结果。我优雅地退出:]我从来没有真正做到过。听起来像是新实习生的任务!请不要用“Mac”来做假想。我的名字经常被愚蠢的邮件系统弄伤。@MaciejTrybiło:机器会这样做的。虽然这段代码可以回答这个问题,但提供了关于为什么和/或这段代码如何回答这个问题提高了它的长期价值。这并没有解决“Mc”案例。标题案例将使它成为“麦当劳”而不是“麦当劳”。你太棒了!谢谢!