如果我有一個字符串,我該如何從字符串中提取第一個字母字符,以便最終得到起始字母字符或空字符串。例如:如何從字符串中獲得第一組字母字符?
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'看起來更合適。 –