【发布时间】:2016-09-02 12:04:56
【问题描述】:
如果我有一个字符串,我如何从字符串中提取第一个字母字符,以便我以起始字母字符或空字符串结尾。例如:
AB12 9HG => "AB"
PJ11 => "PJ"
123JO => ""
这可以通过正则表达式实现还是有更简单的方法?
【问题讨论】:
如果我有一个字符串,我如何从字符串中提取第一个字母字符,以便我以起始字母字符或空字符串结尾。例如:
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 构建结果:
new String(s.TakeWhile(p => Char.IsLetter(p)).ToArray());
基本上,只取从头到尾的字符直到第一个非字母字符。
如果有前导空格,Trim() 字符串优先。
【讨论】:
@"^\p{L}*",但在这里,您可以使用非正则表达式获得所需的内容 - 除非您只想限制某些特定的脚本。
TrimStart 而不是Trim,也可以使用s.TakeWhile(Char.IsLetter)
TrimStart 看起来更合适。
下面是另一种 LINQ 方法,可让您定义可接受的字符列表。像这样创建一个HashSet<char>:
private HashSet<char> _alphas = new HashSet<char>("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
现在您可以使用这个简单高效的 LINQ 查询了:
string result = string.Concat(input.TakeWhile(_alphas.Contains));
【讨论】:
可能是这样的:
^([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 => ""
【讨论】:
我使用的是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();
【讨论】: