【问题标题】:How to get only first letters from string in C#如何只从C#中的字符串中获取第一个字母
【发布时间】:2017-07-15 08:39:54
【问题描述】:

我是 C# 新手,我正在使用 Windows 窗体。 我正在处理邮政编码字符串,我试图从邮政编码中获取第一个字母并将其存储在一个变量中,例如:

BL9 8NS(我要拿BL)

L8 6HN(我想要L)

CH43 7TA(我要CH)

WA8 7LX(我想要WA)

我只想获取数字之前的第一个字母,如您所见,字母的数量可以是 1 或 2,也可能是 3。 有谁知道该怎么做?谢谢

【问题讨论】:

标签: c#


【解决方案1】:

由于string 实现IEnumerable<char>,使用Linq TakeWhilechar.IsLetter 将非常容易:

string firstLetters = string.Concat(str.TakeWhile(char.IsLetter));

【讨论】:

    【解决方案2】:

    使用带有组的正则表达式来匹配第一个字母。

    这是您需要的正则表达式:

    ^([a-zA-Z]+)
    

    你可以这样使用它:

    Regex.Match("BL9 8NS", "^([a-zA-Z]+)").Groups[1].Value
    

    上面的表达式将计算为“BL”。

    记得给System.Text.RegularExpressions添加一个using指令!

    【讨论】:

    • 此模式不匹配以小写字母开头的字符串
    • @Joe_DM 就我而言,邮政编码没有小写字母,对吧?
    • 我不在美国,所以我同意只是因为邮政编码没有任何字母。 Op 以邮政编码为例,但请考虑其他有不同要求的人稍后发现此问题。此外,谁曾信任用户输入完美的数据。 ^([a-zA-Z]+) 应该匹配所有内容。
    【解决方案3】:

    您可以使用StringBuilder 并遍历字符直到第一个非字母。

    string text = "BL9 8NS";
    StringBuilder sb = new StringBuilder();
    foreach(char c in text) {
        if(!char.IsLetter(c)) {
            break;
        }
        sb.Append(c);
    }
    string result = sb.ToString(); // BL
    

    或者,如果你不关心性能,只想简单,你可以使用TakeWhile

    string result = new string(text.TakeWhile(c => char.IsLetter(c)).ToArray());
    

    【讨论】:

    • 为什么是字符串生成器?
    • @Mhd.Tahawi 比连接字符串更快。
    • @Mhd.Tahawi 该操作发布的示例很小,但谁知道这可以在生产中使用多长时间?如果字符串在第一个非数字之前有 1000 个字符怎么办? string 是不可变的,因此我们不想在堆栈上创建 1000 个新的引用类型对象。
    • @Joe_DM,是的,也许我不清楚。当你可以做 substr 时为什么要循环和连接
    • @Mhd.Tahawi 你是说,循环找到第一个非 alpha 的 indexOf,然后打破循环并做一个子字符串......我可以加入! :)
    【解决方案4】:

    怎么样

    string result = postcode.Substring(0, postcode.IndexOf(postcode.First(Char.IsDigit)));
    

    如果您的邮政编码始终包含该数字,First 将不会引发任何异常。

    【讨论】:

    • 有很多非字母数字字符可能出现在一个小数字之前。也许postcode.First(!Char.IsLetter)
    • 如果您担心,FirstOrDefault 不会例外。
    • Substring 在这种情况下会(使用FirstOrDefault
    • 好点,我想这需要一些外部保护条款来防止它变成错误。无论哪种方式,这对操作都是一个很好的提示,并为他指明了正确的方向:)
    【解决方案5】:
    char[] numbers = new char[]{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
    
    string a = "BL9 8NS";
    string result = a.Substring( 0, a.IndexOfAny(numbers) );
    Console.WriteLine( result );
    

    【讨论】:

    • 首先出现空格或其他非字母数字字符时会怎样?
    • 它们将被显示,即:a = "> BL9 8NS",结果为 = "> BL"
    • 我在考虑这样的输入值“BL ♣ 9 8NS”
    • a = "BL ♣ 9 8NS",结果 = "BL ♣"
    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    【解决方案6】:

    虽然 Ofir Winegarten 的答案真的很棒,但我投了赞成票,我想分享我在突然停电之前写的答案!

    string code = "BL9 8NS";
    string myStr = "";
    for (int i = 0; i < code.Length; i++)
      {
         if (char.IsNumber(code[i]))
             break;
         else
             myStr += code[i];
      }
    

    【讨论】:

    • int.TryParse(code[i].ToString(), out int _n) - 不,不,不!在 .Net 中,您可以使用 char.IsXXX() 方法,其中 XXX - 是 Unicode 类别之一。 char.IsDigit() 就是其中之一。它更快更容易阅读
    猜你喜欢
    • 2018-07-11
    • 2023-03-24
    • 2013-10-29
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多