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

时间:2009-12-21 23:21:27

标签: c# asp.net regex

我需要转换一段文字(主要是大约5-6个单词)。

目前文字如下:

THIS IS MY TEXT RIGHT NOW

我想将其转换为:

This Is My Text Right Now

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

11 个答案:

答案 0 :(得分:241)

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

s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

答案 1 :(得分:81)

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

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

但它应该与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

<强> 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

参考文献:

答案 2 :(得分:15)

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

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

public string UppercaseFirst(string s)
    {
        return char.ToUpper(s[0]) + s.Substring(1);
    }

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

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

答案 3 :(得分:9)

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

style="text-transform:capitalize;"

答案 4 :(得分:8)

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

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()));

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

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

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

答案 6 :(得分:2)

我不知道下面的解决方案是否比jspcal的答案更有效或更低效,但我很确定它需要的创建对象的次数少于Jamie和George的。

string s = "THIS IS MY TEXT RIGHT NOW";
StringBuilder sb = new StringBuilder(s.Length);
bool capitalize = true;
foreach (char c in s) {
    sb.Append(capitalize ? Char.ToUpper(c) : Char.ToLower(c));
    capitalize = !Char.IsLetter(c);
}
return sb.ToString();

答案 7 :(得分:0)

除了第一个答案之外,请记住将字符串selectionstart索引更改为单词的结尾,否则您将在字符串中获得相反的字母顺序。

s.SelectionStart=s.Length;

答案 8 :(得分:0)

尝试这种技术;返回期望的结果

CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());

请不要忘记使用 System.Globalization

答案 9 :(得分:0)

您可能感兴趣的一种可能的解决方案。在一个循环中从右到左遍历一个字符数组,反之亦然。

public static string WordsToCapitalLetter(string value)
    {
        if (string.IsNullOrWhiteSpace(value))
        {
            throw new ArgumentException("value");
        }

        int inputValueCharLength = value.Length;
        var valueAsCharArray = value.ToCharArray();

        int min = 0;
        int max = inputValueCharLength - 1;

        while (max > min)
        {
            char left = value[min];
            char previousLeft = (min == 0) ? left : value[min - 1];

            char right = value[max];
            char nextRight = (max == inputValueCharLength - 1) ? right : value[max - 1];

            if (char.IsLetter(left) && !char.IsUpper(left) && char.IsWhiteSpace(previousLeft))
            {
                valueAsCharArray[min] = char.ToUpper(left);
            }

            if (char.IsLetter(right) && !char.IsUpper(right) && char.IsWhiteSpace(nextRight))
            {
                valueAsCharArray[max] = char.ToUpper(right);
            }

            min++;
            max--;
        }

        return new string(valueAsCharArray);
    }

答案 10 :(得分:0)

jspcal作为字符串扩展名的答案。

Program.cs

class Program
{
    static void Main(string[] args)
    {
        var myText = "MYTEXT";
        Console.WriteLine(myText.ToTitleCase()); //Mytext
    }
}

StringExtensions.cs

using System;
public static class StringExtensions
{

    public static string ToTitleCase(this string str)
    {
        if (str == null)
            return null;

        return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
    }
}