如果我有一个字符串,我该如何从字符串中提取第一个字母字符,以便最终得到起始字母字符或空字符串。例如:如何从字符串中获得第一组字母字符?
AB12 9HG => "AB"
PJ11 => "PJ"
123JO => ""
这是可能的正则表达式还是有更简单的方法吗?
如果我有一个字符串,我该如何从字符串中提取第一个字母字符,以便最终得到起始字母字符或空字符串。例如:如何从字符串中获得第一组字母字符?
AB12 9HG => "AB"
PJ11 => "PJ"
123JO => ""
这是可能的正则表达式还是有更简单的方法吗?
您可以使用LINQ来构建结果:
new String(s.TakeWhile(p => Char.IsLetter(p)).ToArray());
基本上,只要采取从一开始的字符,直到第一个非字母字符。
如果存在领先的空白,Trim()
字符串首先。
可能是这样的:
^([A-Za-z])*
这是用正则表达式非常简单。只需与^
匹配,然后匹配零个或多个*
您想要的字符[A-Za-z]
。
var inputs = new[] { "AB12 9HG", "PJ11", "123JO" };
Regex regex = new Regex(@"^[A-Za-z]*");
foreach (var x in inputs)
{
Console.WriteLine(x + " => \"" + regex.Match(x).Value + "\"");
}
输出
AB12 9HG => “AB”
PJ11 => “PJ”
123JO => “”
下面是一个例子( https://dotnetfiddle.net/CiIaqx):
个var inputs = new [] { "ASD123", "PJ11", "123JO" };
foreach (var input in inputs)
{
var match = Regex.Match(input, "^([a-z]*)", RegexOptions.IgnoreCase);
if (match.Success)
{
Console.WriteLine("Checking: " + input + ", found: " + match.Groups[1].Value);
}
}
此输出:
检查:ASD123,实测值:ASD
检查:PJ11,实测值:PJ
检查:123JO,实测值:
另一个LINQ让我们来定义一个可接受的字符列表。这样创建HashSet<char>
一次:
private HashSet<char> _alphas = new HashSet<char>("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
现在你可以使用这个简单而有效的LINQ查询:
string result = string.Concat(input.TakeWhile(_alphas.Contains));
我使用的是Portable Class Library
所以没有必须进入TakeWhile
方法上的绳子,(或者我不能看到)。
我因此延长从Wiktors答案的想法,并想出了我的字符串扩展方法:
public static class StringExtensions
{
public static string GetStartChars(this string s)
{
var result = string.Empty;
if (!string.IsNullOrEmpty(s))
{
s = s.TrimStart();
foreach (var letter in s.ToCharArray())
{
if (char.IsLetter(letter))
{
result += letter;
}
else
{
break;
}
}
}
return result;
}
}
这样使用它:
var startChars = "AB11".GetStartChars();
参见[C#演示(HTTPS:/ /ideone.com/4M1I9Y)。顺便说一句,获得首字母的正则表达式是'@“^ \ p {L} *”',但在这里,您可以通过非正则表达式获得所需的内容 - 除非您只想限制某些特定的脚本。 –
不错,有些“微观优化”:你可以使用'TrimStart'而不是'Trim',你可以使用's.TakeWhile(Char.IsLetter)' –
是的,'TrimStart'看起来更合适。 –