【问题标题】:c# trying to change first letter to uppercase but doesn't workc#试图将第一个字母更改为大写但不起作用
【发布时间】:2015-07-14 05:02:04
【问题描述】:

我必须将用户输入的每个单词的首字母转换为大写。我不认为我做对了,所以它不起作用,但我不确定哪里出了问题 D:提前谢谢你的帮助! ^^

static void Main(string[] args)
    {
        Console.Write("Enter anything: ");
        string x = Console.ReadLine();

        string pattern = "^";
        Regex expression = new Regex(pattern);
        var regexp = new System.Text.RegularExpressions.Regex(pattern);

        Match result = expression.Match(x);
        Console.WriteLine(x);

        foreach(var match in x)
        {
            Console.Write(match);
        }
        Console.WriteLine();
    }

【问题讨论】:

  • 你能添加一些输入和预期输出吗?
  • 你有义务使用Regex吗?
  • @sybren 是的!我必须使用正则表达式 D:
  • @vks 例如,如果我输入“hello i am sam”,它应该打印为“Hello I Am Sam”
  • @eyeballs 这是一个使用 Regex 的示例:tutorialspoint.com/javaexamples/regular_case.htm

标签: c# regex uppercase


【解决方案1】:

首先,您的正则表达式“^”匹配一行的开头。如果您需要匹配多字行中的每个单词,则需要不同的正则表达式,例如“[A-Za-z]”。

您也没有做任何事情来将第一个字母实际更改为大写。请注意,C# 中的字符串是不可变的(创建后无法更改),因此您需要创建一个新字符串,该字符串由原始字符串的第一个字母大写,然后是字符串的其余部分组成。自己尝试一下。如果您遇到问题,请在尝试时发布一个新问题。

【讨论】:

    【解决方案2】:

    如果您的练习不是正则表达式操作,则有内置实用程序可以满足您的要求:

    System.Globalization.TextInfo ti = System.Globalization.CultureInfo.CurrentCulture.TextInfo;
    string titleString = ti.ToTitleCase("this string will be title cased");
    
    Console.WriteLine(titleString);
    

    打印:

    这个字符串将是标题大小写

    如果您操作是针对正则表达式,请参阅之前的 StackOverflow 答案:Sublime Text: Regex to convert Uppercase to Title Case?

    【讨论】:

      【解决方案3】:
      string pattern = "(?:^|(?<= ))(.)"
      

      ^ 本身不会捕获任何内容。您可以通过将函数应用于$1 来替换为uppercase letters。参见演示。

      https://regex101.com/r/uE3cC4/29

      【讨论】:

        【解决方案4】:

        希望对你有帮助

        public static string CapsFirstLetter(string inputValue)
            {
                char[] values = new char[inputValue.Length];
                int count = 0;
                foreach (char f in inputValue){
                    if (count == 0){
                        values[count] = Convert.ToChar(f.ToString().ToUpper());
                    }
                    else{
                        values[count] = f;
                    }
                    count++;
                }
                return new string(values);
            }
        

        【讨论】:

          【解决方案5】:

          另一种使用正则表达式的方法:

          string input = "this string will be title cased, even if there are.cases.like.that";
          string output = Regex.Replace(input, @"(?<!\w)\w", m => m.Value.ToUpper());
          

          【讨论】:

            【解决方案6】:

            我会使用模型扩展来解决这个问题。

            PHP 有一个很好的方法,叫做 ucfirst。 所以我把它翻译成C#

            public static string UcFirst(this string s)
            {
                var stringArr = s.ToCharArray(0, s.Length);
                var char1ToUpper = char.Parse(stringArr[0]
                    .ToString()
                    .ToUpper());
            
                stringArr[0] = char1ToUpper;
            
                return string.Join("", stringArr);
            }
            

            用法:

            [Test]
            public void UcFirst()
            {
                string s = "john";
                s = s.UcFirst();
                Assert.AreEqual("John", s);
            }
            

            显然,您仍然需要将句子拆分为一个列表,并为列表中的每个项目调用 UcFirst。

            如果您需要有关正在发生的事情的帮助,请使用 Google C# 模型扩展。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-17
              相关资源
              最近更新 更多