我不明白你爲什麼執意要在這裏使用正則表達式。一個簡單的單線程會做,例如。即使是這樣的擴展方法:
static int NumbersCount(this string str)
{
return str.ToCharArray().Where(c => Char.IsNumber(c)).Count();
}
在我看來,它更清晰,更易維護。
你也許可以把它與組匹配和東西沿
"(?<client>[0-9]{5,9}?)|(?<serial>[0-9]{10}?)|(?<mobile>[0-9]{13,}?)"
行一去然後你會檢查是否有「客戶」比賽,「串行」,「移動」和在此基礎上解釋字符串輸入。但是更容易理解?
對於那些稍後閱讀您的代碼,它是否更清楚地表達您的意圖?
如果需求是這樣的,這些數字必須是連續的(如@Corak指出的)......我還是會寫的反覆,像這樣:
/// <summary>
/// returns lengths of all the numeric sequences encountered in the string
/// </summary>
static IEnumerable<int> Lengths(string str)
{
var count = 0;
for (var i = 0; i < str.Length; i++)
{
if (Char.IsNumber(str[i]))
{
count++;
}
if ((!Char.IsNumber(str[i]) || i == str.Length - 1) && count > 0)
{
yield return count;
count = 0;
}
}
}
然後你可以簡單地:
bool IsClientID(string str)
{
var lenghts = Lengths(str);
return lenghts.Count() == 1 && lenghts.Single() == 5;
}
它更冗長嗎?是的,但有可能人們仍然會喜歡你,而不是每當驗證規則發生變化時讓他們擺弄正則表達式,或者需要一些調試:)這包括你未來的自我。
您是否搜索過正則表達式c#中的數字計數?此外,如果只有這3種類型只計算字符串中的字符數 - >'yourMagicString.Length'並檢查編號 – wudzik
只需匹配數字,然後通過'value.Length'決定? – Corak
是的,@Corak – user1358072