【问题标题】:How to remove lowercase on a textbox?如何删除文本框上的小写字母?
【发布时间】:2011-08-30 21:39:51
【问题描述】:

我正在尝试删除 TextBox.. 上的小写字母。

例如,代表保险的短字母代码(例如,“BCBS”代表“Blue Cross Blue Shield”):

txtDesc.text = "Blue Cross Blue Shield";

string Code = //This must be BCBS.. 

有可能吗?请帮我。谢谢!

【问题讨论】:

  • 如果用户输入“BLUE CROSS BLUE SHIELD”,或者更糟的是“blue cross blue shield”怎么办?

标签: c# .net string uppercase


【解决方案1】:

这并不完美,但应该可以工作(并通过您的 BCBS 测试):

private static string AlphaCode(String Input)
{
    List<String> capLetter = new List<String>();
    foreach (Char c in Input)
    {
        if (char.IsLetter(c))
        {
            String letter = c.ToString();
            if (letter == letter.ToUpper()) { capLetter.Add(letter); }
        }
    }
    return String.Join(String.Empty, capLetter.ToArray());
}

而且这个版本会处理奇怪的输入场景(这样可以确保每个单词的首字母大写)。

private static string AlphaCode(String Input)
{
    String capCase = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(Input.ToString().ToLower());

    List<String> capLetter = new List<String>();
    foreach (Char c in capCase)
    {
        if (char.IsLetter(c))
        {
            String letter = c.ToString();
            if (letter == letter.ToUpper()) { capLetter.Add(letter); }
        }
    }
    return String.Join(String.Empty, capLetter.ToArray());
}

【讨论】:

    【解决方案2】:

    我认为规范不是匹配所有大写字母,而是要求匹配所有单词中的第一个字符。这将允许不一致的输入,但从长远来看仍然是可靠的。因此,我建议使用以下代码。它对来自Regex 对象的每个Match 使用聚合,并将值附加到名为output 的字符串对象。

    string input = "Blue Cross BLUE shield 12356";
    Regex regex = new Regex("\\b\\w");
    string output = regex.Matches(input).Cast<Match>().Aggregate("", (current, match) => current + match.Value);
    Console.WriteLine(output.ToUpper()); // outputs BCBS1
    

    【讨论】:

    • P.s.s 这里使用的正则表达式使用 \b 表示单词边界和 \w 表示单词字符。单词字符可以是大写或小写或来自任何文化:)
    【解决方案3】:

    没有正则表达式:

    string input = "Blue Cross Blue Shield";
    string output = new string(input.Where(Char.IsUpper).ToArray());
    Response.Write(output);
    

    【讨论】:

    • 和@Andrew Cooper string Code = new String(txtDesc.text.Where(c =&gt; IsUpper(c)).ToArray());的答案相同
    • 我不同意,它相似但不一样:(1)@andrew-cooper 答案不编译(如@jon-skeet 所评论)它应该是 Char.IsUpper。 (2) Char.IsUpperc =&gt; Char.IsUpper(c) 不同,因为它用方法组替换了匿名方法 - 请参阅 link
    【解决方案4】:
    string caps = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    string.Join("",
       "Blue Cross Blue Shield".Select(c => caps.IndexOf(c) > -1 ? c.ToString() : "")
                               .ToArray());
    

    【讨论】:

      【解决方案5】:
      string Code = Regex.Replace(txtDesc.text, "[a-z]", "");
      

      【讨论】:

      • 这不会删除空格(或数字)。
      【解决方案6】:

      您可以尝试使用 'Replace lowercase characters with star' 实现,但将 '*' 更改为 ''(空白)

      所以代码看起来像这样:

      txtDesc.Text = "Blue Cross Blue Shield";
      string TargetString = txt.Desc.Text;
      string MainString = TargetString;
      for (int i = 0; i < TargetString.Length; i++)
      {
          if (char.IsLower(TargetString[i]))
          {
              TargetString = TargetString.Replace( TargetString[ i ].ToString(), string.Empty );
          }
      }
      Console.WriteLine("The string {0} has converted to {1}", MainString, TargetString);
      

      【讨论】:

      • 这需要将替换的结果分配给某物;-)
      • Replace 不是 TextBox 的成员 :(
      • 不完全。 '' 是一个空字符文字,这是不允许的。 string.Replace(string,string) 可以工作(允许使用空字符串),但逻辑中仍然存在一个错误,会产生不正确的结果。 LINQPad 是一个测试快速代码的简洁工具。该错误必须执行,因为跳过了某些字符-替换后更改了索引。
      【解决方案7】:

      我会将值映射到您在字典中的缩写,例如:

      Dictionary<string, string> valueMap = new Dictionary<string, string>();
      valueMap.Add("Blue Cross Blue Shield", "BCBS");
      
      string Code = "";
      if(valueMap.ContainsKey(txtDesc.Text))
        Code = valueMap[txtDesc.Text];
      else
        // Handle
      

      但如果您仍然想要您提到的功能,请使用 linq:

      string newString = new string(txtDesc.Text.Where(c => char.IsUpper(c).ToArray());
      

      【讨论】:

      • 您的 LINQ 代码无法编译,即使编译了 - 也能做到。
      • 对不起!我没有仔细检查语法,String.Join 对字符不友好。应该像现在一样使用 new string() ,否则请查看 Andrew Coopers 的答案。
      • 再看一下 Coopers 的回答,我已经翻转了选择所有小写字母的功能。
      【解决方案8】:
      string Code = Regex.Replace(txtDesc.text, "[a-z]", "");
      

      【讨论】:

      • 这不会删除空格(或数字)。
      【解决方案9】:
      string Code = new String(txtDesc.text.Where(c => IsUpper(c)).ToArray());
      

      【讨论】:

      • 我同意这一点,并添加了使用 c => IsUpper(c) || 删除空格c == ' ' 或 c => IsUpper(c) || IsWhiteSpace(c)。
      • @Almund 为什么要进行空格检查?
      • 按原样,那是行不通的。它将编译,然后在执行时因强制转换异常而失败。你需要类似string code = new string(txtDesc.text.Where(c =&gt; IsUpper(c)).ToArray());
      • 为什么这会失败,因为从 IEnumerable&lt;char&gt;string 有一个明确的? :(
      • @Almund - 为什么要让谓词返回 true 以表示空格。这个想法是只从序列中返回大写字符的字符。 .Where(c =&gt; IsUpper(c)) 会做到这一点。
      【解决方案10】:

      这是我的变种:

      var input = "Blue Cross Blue Shield 12356";
      var sb = new StringBuilder();
      foreach (var ch in input) {
        if (char.IsUpper(ch)) { // only keep uppercase
          sb.Append(ch);
        }
      }
      sb.ToString(); // "BCBS"
      

      我通常喜欢使用正则表达式,但我不知道如何在没有[A-Z] 的情况下在其中选择“仅大写”,这会严重破坏英文字母表以外的字符(甚至是其他拉丁字符!:-/)

      编码愉快。


      但请参阅 Skeet 先生对正则表达式的回答 ;-)

      【讨论】:

        【解决方案11】:

        您可以使用正则表达式删除所有不是大写 A-Z 的内容:

        using System;
        using System.Text.RegularExpressions;
        
        class Program
        {
            static void Main( string[] args )
            {
                string input = "Blue Cross Blue Shield 12356";
                Regex regex = new Regex("[^A-Z]");
                string output = regex.Replace(input, "");
                Console.WriteLine(output);
            }
        }
        

        请注意,这会删除任何非ASCII字符。另一种正则表达式是:

        Regex regex = new Regex(@"[^\p{Lu}]");
        

        ...我认为应该涵盖所有文化的大写字母。

        【讨论】:

        • 可能是new Regex("...", RegexOptions.Compiled)?
        • @abatishev - 编译需要额外的时间,你不希望在使用过一次的本地正则表达式上这样。
        • 实际上它应该被编译和缓存(或者可能存储在静态变量中),因为每个请求创建新的正则表达式可能会更长一些......但它仍然是这样一个微优化;)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-11
        • 1970-01-01
        相关资源
        最近更新 更多