我有这种类型的string
:
"10a10", "10b5641", "5a1121", "438z2a5f"
,我需要删除字符串中 FIRST a-zA-Z
字符之后的所有内容(符号本身也应删除)。有什么解决方案?
我期望的结果示例:
"10a10" returns "10"
"10b5641" returns "10"
"5a1121" returns "5"
"438z2a5f" returns "438"
答案 0 :(得分:4)
您可以将Regular Expressions
与Regex
一起使用,例如:
string str = "10a10";
str = Regex.Replace(str, @"[a-zA-Z].*", "");
Console.WriteLine(str);
将输出:
10
基本上,它将以a-zA-Z
开头的所有内容和之后的所有内容(.*
匹配零个或无限次匹配的任何字符),并将其从字符串中删除。
答案 1 :(得分:1)
您可以按以下方式使用Linq进行操作。
var result = new string(strInput.TakeWhile(x => !char.IsLetter(x)).ToArray());
答案 2 :(得分:1)
一种易于理解的方法是使用String.IndexOfAny方法查找第一个a-zA-Z字符的索引,然后使用String.Substring方法相应地剪切字符串。
为此,您将创建一个包含所有a-zA-Z字符的数组,并将其用作String.IndexOfAny的参数。之后,将0和String.IndexOfAny的结果用作String.Substring的参数。
我很确定有更多优雅的方法可以做到这一点,但这对我来说似乎是最基本的方法,因此值得一提。
答案 3 :(得分:0)
Linq 中的任何一个:
var result = string.Concat(strInput
.TakeWhile(c => !((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')));
或正则表达式:
using System.Text.RegularExpressions;
...
var result = Regex.Match(strInput, "^[^A-Za-z]*").Value;
在两种情况下,从strInput
开始都采用字符,直到出现a..z
或A-Z
演示:
string[] tests = new[] {
"10a10", "10b5641", "5a1121", "438z2a5f"
};
string demo = string.Join(Environment.NewLine, tests
.Select(test => $"{test,-10} returns \"{Regex.Match(test, "^[^A-Za-z]*").Value}\""));
Console.Write(demo);
结果:
10a10 returns "10"
10b5641 returns "10"
5a1121 returns "5"
438z2a5f returns "438"
答案 4 :(得分:0)
var sList = new List<string> { "10a10", "10b5641", "5a1121", "438z2a5f" };
foreach (string s in sList.ToArray())
{
string number = new string(s.TakeWhile(c => !Char.IsLetter(c)).ToArray());
Console.WriteLine(number);
}