如何使用LINQ从字符串中删除字符

10

我有一个字符串:

XQ74MNT8244A

我需要从该字符串中删除所有字符。

因此输出将是:

748244

如何实现? 请帮我做到这一点。


你不需要使用正则表达式 - 参见@Tim Robinson的答案。 - ChrisF
你不想要关于LINQ的答案吗?你能重新改写你的问题,或者关闭它并发表一个新的问题吗? - Tim Robinson
1
你的问题要求使用LINQ,但是你的评论要求使用正则表达式。你实际上想要什么?在这种情况下,我认为LINQ是最好的解决方案,因为Tim Robinson的解决方案比任何基于RegEx的解决方案更易读。 - Øyvind Bråthen
8个回答

24
new string("XQ74MNT8244A".Where(char.IsDigit).ToArray()) == "748244"

2
非常优雅。这里有一个问题。在这种情况下,Where(char.IsDigit)是如何工作的?我认为你必须在这里写Where(c => char.IsDigit(c)),难道编译器在这种情况下做了一些魔法吗?希望能得到解释。 - Øyvind Bråthen
5
@Øyvind - 没有魔法。 Char.IsDigit 是一个函数,它接受一个 char 并返回一个布尔值 - 正是 Where 需要的。你不需要将其包装在匿名函数中。(哦,而且编译器会做很多魔法,比如匿名函数) - Kobi
@Øyvind,您可以向“Where”方法提供任何委托;Lambda语法只是获取委托的一种方式。如果您的Lambda直接调用某个方法,并且该方法的参数类型和返回类型与Lambda相匹配,则可以直接提供方法名称。 - Tim Robinson
@Kobi和Tim - 谢谢。我看到它当然应该这样工作,但我从未想过。这可能使我的代码更整洁,有些地方可以省略包装器。非常感谢。 - Øyvind Bråthen
该值不是以一个字符串的形式出现的,而是被索引和分隔的。如何将数字或字母组合成一个字符串? - aspiring

12

有两个选项。在 .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٣٤"
你可以轻松地将它们适应于检查 09 之间的数字,或者使用 [^0-9]+


使用LINQ可以做很多事情,但这并不意味着它应该用于所有情况。对于建议使用RegEx选项,点赞! - Unmesh Kondolikar
2
这里使用string.concat比我原本想用的.ToArray()更好。 - Andy Lowry
@Unmesh 我同意Linq很容易被看作是一把通用工具,我自己有时也会犯这个错误。但在这种情况下,我认为Linq方案比正则表达式更容易阅读。(可能更快) - Andy Lowry
@Andy - 谢谢!再次感谢。.Net 4有一个接受 IEnumerable<char> 的过载函数,所以非常适合,并且可能已经针对此进行了优化。 - Kobi

6
string value = "HTQ7899HBVxzzxx";
Console.WriteLine(new string(
     value.Where(x => (x >= '0' && x <= '9'))
     .ToArray()));

2
如果您只需要数字并且确实想使用Linq,请尝试以下代码:
youstring.ToCharArray().Where(x => char.IsDigit(x)).ToArray();

ToCharArray() 在这里是无用的,因为它实现了 IEnumerable。 - pierroz
@PierrOz - 这是绝对正确的。然而,Visual Studio 2008 Intellisense 隐藏了 IEnumerable<Char> 扩展方法,因此很容易被忽略。 - Kobi

2
string s = "XQ74MNT8244A";
var x = new string(s.Where(c => (c >= '0' && c <= '9')).ToArray());

2
如何使用扩展方法(和重载)为您完成此操作:
    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();

2

使用LINQ:

public string FilterString(string input)
{
    return new string(input.Where(char.IsNumber).ToArray());
}

2
像这样的内容吗?

"XQ74MNT8244A".ToCharArray().Where(x => { var i = 0; return Int32.TryParse(x.ToString(), out i); })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接