如何在C#中获取字符串的首字母?

7
我刚开始学习C#,使用的是Windows窗体。 我正在处理邮政编码字符串,并尝试获取邮政编码的前几个字母并将其存储在一个变量中,例如:
BL9 8NS(我想要获取BL)
L8 6HN(我想要获取L)
CH43 7TA(我想要获取CH)
WA8 7LX(我想要获取WA)
我只想获取数字前面的第一个或前两个字母。如你所见,字母数量可能为1、2或3个。有人知道如何做吗?谢谢!

使用正则表达式模式可能是最简单的选项。 - Scott Chamberlain
我在这里查看了一下,但没有运气。 - Sam
https://dev59.com/Fmw05IYBdhLWcg3wUAM0 - Sam
https://dev59.com/U2Qn5IYBdhLWcg3wGT8X - Sam
6个回答

18

因为 string 实现了 IEnumerable<char> 接口,所以使用 Linq 的 TakeWhile 方法和 char.IsLetter 方法非常简单:

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

5

使用带有分组的正则表达式来匹配首字母。

您需要使用以下正则表达式:

^([a-zA-Z]+)

您可以像这样使用它:
Regex.Match("BL9 8NS", "^([a-zA-Z]+)").Groups[1].Value

上述表达式将评估为“BL”。

记得添加一个System.Text.RegularExpressions的使用指令!


此模式不匹配以小写字母开头的字符串。 - Joe_DM
@Joe_DM 就我所知,邮政编码没有小写字母,对吧? - Sweeper
1
我不在美国,所以我同意只是因为邮政编码没有任何字母。虽然OP使用邮政编码作为示例,但请考虑其他人在以后具有不同要求的这个问题。此外,谁信任用户输入完美的数据。 ^([a-zA-Z] +)应该匹配一切。 - Joe_DM

2
您可以使用 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());

为什么要使用字符串构建器? - Moha the almighty camel
@Mhd.Tahawi 比字符串拼接更快。 - GregorMohorko
1
@Mhd.Tahawi,OP发布的示例很小,但是谁知道它在生产中会有多长时间?如果在第一个非数字字符之前有1000个字符怎么办?string是不可变的,因此我们不希望在堆栈上创建1000个新的引用类型对象。 - Joe_DM
@Joe_DM,确实,也许我表达不够清晰。为什么要循环和连接,当你可以直接使用substr呢? - Moha the almighty camel
2
@Mhd.Tahawi 你是在说,循环查找第一个非字母字符的indexOf,然后跳出循环并进行子字符串操作... 我可以接受这个想法! :) - Joe_DM
@Joe_DM,这就是我所指的(再来一个答案:D) - Moha the almighty camel

1
什么意思?
string result = postcode.Substring(0, postcode.IndexOf(postcode.First(Char.IsDigit)));

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

可能会出现许多非字母数字字符在数字之前。也许可以使用 postcode.First(!Char.IsLetter) - Joe_DM
如果你担心异常,FirstOrDefault 不会抛出异常。 - Joe_DM
但是在这种情况下(使用FirstOrDefault),Substring会这样做 - NotADeveloper
好的观点,我想这需要一些外部守卫条款来防止它变得有缺陷。无论如何,这对于提问者来说是一个很好的提示,并指引他朝着正确的方向前进 :) - Joe_DM

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

当空格首先出现或出现其他非字母数字字符时怎么办? - Joe_DM
它们将被显示,即:a = "> BL9 8NS",结果为 = "> BL"。 - creg
我在考虑这样的输入值:“BL ♣ 9 8NS”。 - Joe_DM
a = "BL ♣ 9 8NS",result = "BL ♣" - creg
虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - Donald Duck

0

虽然 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() 就是其中之一。它更快且更易于阅读。 - pkuderov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接