【问题标题】:How to make the first or last letter of every word in a string lowercase [closed]如何使字符串中每个单词的第一个或最后一个字母小写[关闭]
【发布时间】:2020-02-01 05:04:55
【问题描述】:

假设我们正在传递一个包含多个单词的字符串。

有没有办法让字符串中每个单词的第一个或最后一个字母为小写或大写?

我尝试了文本信息类,但它只为每个第一个字符提供大写方法。

我真的想不出如何对我自己的方法进行硬编码。

【问题讨论】:

  • 虽然this question 只是将第一个字母大写,但答案可能对帮助您完成任务非常有用
  • 这是基本的算法化。 for 循环和字符串索引有什么问题?
  • 如何使字符串中每个单词的最后一个(或第一个)字母小写 => 搁置太宽 =>什么??
  • @OlivierRogier 如果您不同意,您可以投票重新打开它!我也不同意这太宽泛了,尽管如果 OP 发布他们迄今为止的最大努力会很好,这样我们就可以看到需要改进的地方。
  • var result = string.Concat(new CultureInfo(CultureInfo.CurrentCulture.Name).TextInfo.ToTitleCase(string.Concat(input.Reverse())).Reverse()); 可能有效,但它会将每个单词的第一个字母同时小写。

标签: c# string char uppercase lowercase


【解决方案1】:

您可以使用这些扩展方法来放入一个名为例如StringHelper 的静态类:

    using System.Linq;
    static public string LastLetterOfWordsToLower(this string str)
    {
      if ( str == null ) return null;
      var words = str.Split(' ');
      for ( int indexWord = 0; indexWord < words.Length; indexWord++ )
      {
        string word = words[indexWord];
        if ( word != "" )
        {
          for ( int indexChar = word.Length - 1; indexChar >= 0; indexChar-- )
            if ( char.IsLetter(word[indexChar]) )
            {
              char c = char.ToLower(word[indexChar]);
              words[indexWord] = word.Substring(0, indexChar) + c;
              if ( indexChar != word.Length - 1 )
                words[indexWord] += word.Substring(indexChar + 1);
              break;
            }
        }
      }
      return string.Join(" ", words);
    }
    static public string FirstLetterOfWordsToLower(this string str)
    {
      if ( str == null ) return null;
      var words = str.Split(' ');
      for ( int indexWord = 0; indexWord < words.Length; indexWord++ )
      {
        string word = words[indexWord];
        if ( word != "" )
        {
          for ( int indexChar = 0; indexChar < word.Length; indexChar++ )
            if ( char.IsLetter(word[indexChar]) )
            {
              char c = char.ToLower(word[indexChar]);
              words[indexWord] = c + word.Substring(indexChar + 1);
              if ( indexChar != 0 )
                words[indexWord] = word.Substring(0, indexChar) + words[indexWord];
              break;
            }
        }
      }
      return string.Join(" ", words);
    }

测试:

    static public void StringHelperTest()
    {
      string[] list =
      {
        null,
        "",
        "A",
        "TEST",
        "A TEST STRING,  FOR STACK OVERFLOW!!"
      };
      foreach ( string str in list )
        Console.WriteLine(str.LastLetterOfWordsToLower());
      foreach ( string str in list )
        Console.WriteLine(str.FirstLetterOfWordsToLower());
    }

输出:



a
TESt
A TESt STRINg,  FOr STACk OVERFLOw!!


a
tEST
a tEST sTRING,  fOR sTACK oVERFLOW!!

StringBuilder 可用于解决性能问题。

【讨论】:

  • “休斯顿,我们有问题”将被错误处理 - 所以我们有问题:)
  • ...确实... :)
【解决方案2】:

有很多方法可以做到这一点。我建议你使用ToCharArray 方法来获取字符数组。然后,您可以遍历字符并确定哪些字符位于单词的第一个和最后一个字符并更改字母的大小写。这样你只做一次,不做任何字符串构建或连接。

以下是涵盖两种方案的示例方法以及将第一个和最后一个字符设置为较低的组合方法。对于大写字母,您只需将 ToLower 调用替换为对 ToUpper 的调用。

private static string FirstLetterOfWordToLowercase(string stringToTransform)
{
   char[] stringCharacters = stringToTransform.ToCharArray();
   for (int charIndex = 0; charIndex < stringCharacters.Length; charIndex++)
   {
      char currentCharacter = stringCharacters[charIndex];
      if (!isWordSepparator(currentCharacter))
      {
         if (charIndex == 0 || (charIndex > 0 && isWordSepparator(stringCharacters[charIndex - 1])))
         {
            stringCharacters[charIndex] = char.ToLower(currentCharacter);
         }
      }
   }
   return new string(stringCharacters);
}

private static string LastLetterOfWordToLowercase(string stringToTransform)
{
   char[] stringCharacters = stringToTransform.ToCharArray();
   for (int charIndex = 0; charIndex < stringCharacters.Length; charIndex++)
   {
      char currentCharacter = stringCharacters[charIndex];
      if (!isWordSepparator(currentCharacter))
      {
         if (charIndex == stringCharacters.Length - 1 || isWordSepparator(stringCharacters[charIndex + 1]))
         {
            stringCharacters[charIndex] = char.ToLower(currentCharacter);
         }
      }
   }
   return new string(stringCharacters);
}

private static string FirstAndLastLetterOfWordToLowercase(string stringToTransform)
{
   char[] stringCharacters = stringToTransform.ToCharArray();
   for (int charIndex = 0; charIndex < stringCharacters.Length; charIndex++)
   {
      char currentCharacter = stringCharacters[charIndex];
      if (!isWordSepparator(currentCharacter))
      {
         if (charIndex == 0 || charIndex == stringCharacters.Length - 1 // is first or last character
            || (charIndex > 0 && isWordSepparator(stringCharacters[charIndex - 1])) // previous character was a word separator
            || isWordSepparator(stringCharacters[charIndex + 1])) // next character is a word separator
         {
            stringCharacters[charIndex] = char.ToLower(currentCharacter);
         }
      }
   }
   return new string(stringCharacters);
}

private static bool isWordSepparator(char character)
{
   return char.IsPunctuation(character) || char.IsSeparator(character);
}

这里还有一个指向.NET Fiddle 的链接,您可以在其中看到它的工作原理。

【讨论】:

  • 这只会转换整个字符串中的第一个或最后一个字符,而不是每个单词。
  • 是的,你是对的没有仔细阅读我已经更正了我的答案。
猜你喜欢
  • 2021-03-07
  • 2017-07-07
  • 2010-10-27
  • 2022-01-13
  • 1970-01-01
  • 2013-08-24
  • 2016-07-28
  • 2015-12-29
  • 2010-10-29
相关资源
最近更新 更多