我有一个字符串:
XQ74MNT8244A
我需要从该字符串中删除所有字符。
因此输出将是:
748244
如何实现? 请帮我做到这一点。
new string("XQ74MNT8244A".Where(char.IsDigit).ToArray()) == "748244"
Where(char.IsDigit)
是如何工作的?我认为你必须在这里写Where(c => char.IsDigit(c))
,难道编译器在这种情况下做了一些魔法吗?希望能得到解释。 - Øyvind BråthenChar.IsDigit
是一个函数,它接受一个 char
并返回一个布尔值 - 正是 Where
需要的。你不需要将其包装在匿名函数中。(哦,而且编译器会做很多魔法,比如匿名函数) - Kobi有两个选项。在 .Net 4 上使用 Linq(在 3.5 上类似 - 它没有那么多方法的重载):
string s1 = String.Concat(str.Where(Char.IsDigit));
或者,使用正则表达式:
string s2 = Regex.Replace(str, @"\D+", "");
我需要补充说明的是,IsDigit
和 \D
都支持 Unicode,因此它们接受除了 0-9 以外的很多数字,例如 "542abc٣٤"
。
你可以轻松地将它们适应于检查 0
到 9
之间的数字,或者使用 [^0-9]+
。
IEnumerable<char>
的过载函数,所以非常适合,并且可能已经针对此进行了优化。 - Kobistring value = "HTQ7899HBVxzzxx";
Console.WriteLine(new string(
value.Where(x => (x >= '0' && x <= '9'))
.ToArray()));
youstring.ToCharArray().Where(x => char.IsDigit(x)).ToArray();
IEnumerable<Char>
扩展方法,因此很容易被忽略。 - Kobistring s = "XQ74MNT8244A";
var x = new string(s.Where(c => (c >= '0' && c <= '9')).ToArray());
public static string NumbersOnly(this string Instring)
{
return Instring.NumbersOnly("");
}
public static string NumbersOnly(this string Instring, string AlsoAllowed)
{
char[] aChar = Instring.ToCharArray();
int intCount = 0;
string strTemp = "";
for (intCount = 0; intCount <= Instring.Length - 1; intCount++)
{
if (char.IsNumber(aChar[intCount]) || AlsoAllowed.IndexOf(aChar[intCount]) > -1)
{
strTemp = strTemp + aChar[intCount];
}
}
return strTemp;
}
这个重载函数的作用是,如果你需要保留“-”、“$”或者“.”等字符,它也能处理(而不仅仅是数字)。
使用方法:
string numsOnly = "XQ74MNT8244A".NumbersOnly();
使用LINQ:
public string FilterString(string input)
{
return new string(input.Where(char.IsNumber).ToArray());
}
"XQ74MNT8244A".ToCharArray().Where(x => { var i = 0; return Int32.TryParse(x.ToString(), out i); })
正则表达式
- 参见@Tim Robinson的答案。 - ChrisFRegEx
的解决方案更易读。 - Øyvind Bråthen