我有一些字符串這樣只保留字符串中的數字值嗎?
string phoneNumber = "(914) 395-1430";
我想帶出的parethenses和破折號,換句話說只是不停的數值。
所以輸出可能看起來像這樣
9143951430
如何獲得所需的輸出?
我有一些字符串這樣只保留字符串中的數字值嗎?
string phoneNumber = "(914) 395-1430";
我想帶出的parethenses和破折號,換句話說只是不停的數值。
所以輸出可能看起來像這樣
9143951430
如何獲得所需的輸出?
你做任何以下的:
使用正則表達式。您可以使用正則表達式與任何
一個否定的字符類,定義是你不想要的東西(除了十進制數字之外的那些字符)的字符:
private static readonly Regex rxNonDigits = new Regex(@"[^\d]+");
在這種情況下, ,你可以做採取這些方法的執行:
// simply replace the offending substrings with an empty string
private string CleanStringOfNonDigits_V1(string s)
{
if (string.IsNullOrEmpty(s)) return s ;
string cleaned = rxNonDigits.Replace(s, "") ;
return cleaned ;
}
// split the string into an array of good substrings
// using the bad substrings as the delimiter. Then use
// String.Join() to splice things back together.
private string CleanStringOfNonDigits_V2(string s)
{
if (string.IsNullOrEmpty(s)) return s;
string cleaned = String.Join(rxNonDigits.Split(s));
return cleaned ;
}
積極的字符集,它定義你想要什麼(小數位數):
private static Regex rxDigits = new Regex(@"[\d]+") ;
在這種情況下,你可以做這樣的事情:
private string CleanStringOfNonDigits_V3(string s)
{
if (string.IsNullOrEmpty(s)) return s ;
StringBuilder sb = new StringBuilder() ;
for (Match m = rxDigits.Match(s) ; m.Success ; m = m.NextMatch())
{
sb.Append(m.Value) ;
}
string cleaned = sb.ToString() ;
return cleaned ;
}
使用正則表達式,無論是你不需要的。
你可以直接使用LINQ,因爲一個字符串就是一個IEnumerable<char>
:
private string CleanStringOfNonDigits_V4(string s)
{
if (string.IsNullOrEmpty(s)) return s;
string cleaned = new string(s.Where(char.IsDigit).ToArray()) ;
return cleaned;
}
如果你只處理與西方字母,唯一的十進制數字,你會看到的都是ASCII,跳繩char.IsDigit
可能會買你一個小的性能:
private string CleanStringOfNonDigits_V5(string s)
{
if (string.IsNullOrEmpty(s)) return s;
string cleaned = new string(s.Where(c => c-'0' < 10).ToArray()) ;
return cleaned;
}
最後,你可以簡單地遍歷字符串,夾緊你不想要的數字,像這樣:
private string CleanStringOfNonDigits_V6(string s)
{
if (string.IsNullOrEmpty(s)) return s;
StringBuilder sb = new StringBuilder(s.Length) ;
for (int i = 0; i < s.Length; ++i)
{
char c = s[i];
if (c < '0') continue ;
if (c > '9') continue ;
sb.Append(s[i]);
}
string cleaned = sb.ToString();
return cleaned;
}
或者這樣:
private string CleanStringOfNonDigits_V7(string s)
{
if (string.IsNullOrEmpty(s)) return s;
StringBuilder sb = new StringBuilder(s);
int j = 0 ;
int i = 0 ;
while (i < sb.Length)
{
bool isDigit = char.IsDigit(sb[i]) ;
if (isDigit)
{
sb[j++] = sb[i++];
}
else
{
++i ;
}
}
sb.Length = j;
string cleaned = sb.ToString();
return cleaned;
}
從一個清晰的立場和代碼清潔,版本1是你想要的。很難打敗一個班輪。
如果表現很重要,我懷疑版本7是最後一個版本。它創建一個臨時的— a StringBuilder()
並在StringBuilder的in-place緩衝區內原地進行轉換。
其他選項都做更多的工作。
哇,一個非常詳細的答案,你的回答比我的問題更多,這給了我更多的選擇和理解 像你這樣的用戶正在使這是一個偉大的社區。 非常感謝! – meda
使用reg表達式
string result = Regex.Replace(phoneNumber, @"[^\d]", "");
string phoneNumber = "(914) 395-1430";
var numbers = String.Join("", phoneNumber.Where(char.IsDigit));
嘗試這樣的事情
return new String(input.Where(Char.IsDigit).ToArray());
而不是一個正則表達式,你可以使用LINQ方法:
phoneNumber = String.Concat(phoneNumber.Where(c => c >= '0' && c <= '9'));
或:
phoneNumber = String.Concat(phoneNumber.Where(Char.IsDigit));
即使你沒有經驗的正則表達式,你至少應該做一些研究。答案的數量與問題的難度成反比。 – Jerry
總有像你這樣的人抱怨問題,這是一個問答網站,如果我知道我不會問謝謝! – meda
@meda - 你不知道如何谷歌? –