将所有第一个字母转换为大写字母,将每个字母保留为较低字母

mrb*_*lah 107 c# regex asp.net

我有一串文本(大多数约5-6个单词),我需要转换.

目前文本看起来像:

THIS IS MY TEXT RIGHT NOW
Run Code Online (Sandbox Code Playgroud)

我想将其转换为:

This Is My Text Right Now
Run Code Online (Sandbox Code Playgroud)

我可以遍历我的字符串集合,但不知道如何执行此文本修改.

jsp*_*cal 246

string s = "THIS IS MY TEXT RIGHT NOW";

s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
Run Code Online (Sandbox Code Playgroud)

  • 哈哈真的?那就是它的位置?我喜欢.NET,但有些API设计师才是真正的混蛋. (28认同)
  • 我不会称他们为混蛋."ToTitleCase"的含义是它依赖于文化,因此它必须位于System.Globalization命名空间中.通过CurrentThread来完成获取当前的线程文化(请注意,如果用户具有不同的区域设置,这可能会导致不同的行为!).你也可以做"CultureInfo.InvariantCulture.TextInfo.ToTitleCase()",这可能会更好,因为InvariantCulture在所有文化中表现相同.出于兴趣George:你会在哪里放置一个特定于文化的字符串函数? (18认同)
  • 请注意,虽然这种方法可以完成提问者所要求的,但它是一种天真的算法,只是将每个单词大写,而不考虑它是什么类型的单词.这不是真正的"标题案例",因为标题框的规则在不同语言中有所不同.这对英语来说甚至都不正确.例如,标题为"关于一个男孩"应该是英文中的"关于一个男孩",但这种方法会给出"关于一个男孩".如果你想要*true*title case,你必须编写自己的方法. (7认同)
  • 另请注意有关ALL UPPERCASE字符串的注释:http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx (2认同)
  • 方法toLower()应该是ToLower(),方法的第一个字母以大写字母开头 (2认同)

Fil*_*ale 83

我可能更喜欢从CultureInfo(System.Globalization)调用ToTitleCase而不是Thread.CurrentThread(System.Threading)

string s = "THIS IS MY TEXT RIGHT NOW";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
Run Code Online (Sandbox Code Playgroud)

但它应该与jspcal解决方案相同

编辑

实际上那些解决方案并不相同:CurrentThread- 电话 - > CultureInfo!


System.Threading.Thread.CurrentThread.CurrentCulture

string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

IL_0000:  ldstr       "THIS IS MY TEXT RIGHT NOW"
IL_0005:  stloc.0     // s
IL_0006:  call        System.Threading.Thread.get_CurrentThread
IL_000B:  callvirt    System.Threading.Thread.get_CurrentCulture
IL_0010:  callvirt    System.Globalization.CultureInfo.get_TextInfo
IL_0015:  ldloc.0     // s
IL_0016:  callvirt    System.String.ToLower
IL_001B:  callvirt    System.Globalization.TextInfo.ToTitleCase
IL_0020:  stloc.0     // s
Run Code Online (Sandbox Code Playgroud)

System.Globalization.CultureInfo.CurrentCulture

string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

IL_0000:  ldstr       "THIS IS MY TEXT RIGHT NOW"
IL_0005:  stloc.0     // s
IL_0006:  call        System.Globalization.CultureInfo.get_CurrentCulture
IL_000B:  callvirt    System.Globalization.CultureInfo.get_TextInfo
IL_0010:  ldloc.0     // s
IL_0011:  callvirt    System.String.ToLower
IL_0016:  callvirt    System.Globalization.TextInfo.ToTitleCase
IL_001B:  stloc.0     // s
Run Code Online (Sandbox Code Playgroud)

参考文献:


Jam*_*xon 16

有几种方法可以将字符串的第一个字符串转换为大写字母.

第一种方法是创建一个方法,简单地限制第一个字符串,并使用子字符串追加字符串的其余部分:

public string UppercaseFirst(string s)
    {
        return char.ToUpper(s[0]) + s.Substring(1);
    }
Run Code Online (Sandbox Code Playgroud)

第二种方式(稍微快一点)是将字符串拆分为char数组,然后重新构建字符串:

public string UppercaseFirst(string s)
    {
        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }
Run Code Online (Sandbox Code Playgroud)


Geo*_*uer 9

未经测试但这样的事情应该有效:

var phrase = "THIS IS MY TEXT RIGHT NOW";
var rx = new System.Text.RegularExpressions.Regex(@"(?<=\w)\w");
var newString = rx.Replace(phrase,new MatchEvaluator(m=>m.Value.ToLowerInvariant()));
Run Code Online (Sandbox Code Playgroud)

从本质上讲,它表示"在所有出现的字母数字字符之后执行正则表达式匹配,该字符串跟随另一个字母数字字符,然后将其替换为自身的小写版本"


小智 9

如果您在网页上使用,也可以使用CSS:

style="text-transform:capitalize;"

  • 为什么要使用CSS?当问题要求** C#asp.net正则表达式**时 (2认同)
  • 标签 `ASP.NET` 显示 OP 正在 WEB 上执行此操作。当然,这不是问题的答案,因为 OP 需要`C#` 中的解决方案,但它解决了问题并且可以作为替代解决方案。+1 (2认同)

Ser*_*gan 6

在建造大桌子时,速度是一个值得关注的问题,所以Jamie Dixon的第二个功能是最好的,但它并不完全有效......

它无法将所有字母都取小写,它只会将字符串的第一个字母大写,而不是字符串中每个单词的第一个字母...以下选项可以解决这两个问题:

    public string UppercaseFirstEach(string s)
    {
        char[] a = s.ToLower().ToCharArray();

        for (int i = 0; i < a.Count(); i++ )
        {
            a[i] = i == 0 || a[i-1] == ' ' ? char.ToUpper(a[i]) : a[i];

        }

        return new string(a);
    }
Run Code Online (Sandbox Code Playgroud)

虽然在这一点上,这仍然是最快的选择是不确定的,Regex乔治·莫尔提供的解决方案可能会更快......有足够关心的人应该测试它.

  • 它有效,但我将这个"a.Count()"更改为a.Length (2认同)