C# 如何从字符串中去除非字母数字字符(包括空格)?

C# 如何从字符串中去除非字母数字字符(包括空格)?,c#,asp.net,.net,regex,C#,Asp.net,.net,Regex,如何用Replace从C#中的字符串和空格中去掉非字母数字字符 我想保留a-z,a-z,0-9,什么都不要(甚至连“空格”都不要) 应该给 "Hellotherehello" 我尝试了“你好(Hello#)”。替换(@“[^A-Za-z0-9]”,“”)但空格保留。在.Net 4.0中,可以使用String类的IsNullOrWhitespace方法删除所谓的空格字符。请看这里 然而,正如@CodeInChaos所指出的,有很多字符可以被视为字母和数字。如果您只想找到a-Za-z0-9,则可以

如何用Replace从C#中的字符串和空格中去掉非字母数字字符

我想保留a-z,a-z,0-9,什么都不要(甚至连“空格”都不要)

应该给

"Hellotherehello"

我尝试了
“你好(Hello#)”。替换(@“[^A-Za-z0-9]”,“”)但空格保留。

在.Net 4.0中,可以使用String类的IsNullOrWhitespace方法删除所谓的空格字符。请看这里
然而,正如@CodeInChaos所指出的,有很多字符可以被视为字母和数字。如果您只想找到a-Za-z0-9,则可以使用正则表达式。

在您的正则表达式中,您已经排除了匹配的空格(并且您没有使用我完全忽略的
regex.Replace()
):

应该有用。
+
一次匹配多个连续的非字母数字字符,而不是一个接一个地匹配,从而使正则表达式的效率更高

如果还希望保留非ASCII字母/数字,请使用以下正则表达式:

@"[^\p{L}\p{N}]+"
剩下的

BonjourmesélèvesGutenMorgenliebeSchüler
而不是

BonjourmeslvesGutenMorgenliebeSchler

或者你也可以这样做:

    public static string RemoveNonAlphanumeric(string text)
    {
        StringBuilder sb = new StringBuilder(text.Length);

        for (int i = 0; i < text.Length; i++)
        {
            char c = text[i];
            if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9')
                sb.Append(text[i]);
        }

        return sb.ToString();
    }

上面所犯的错误是错误地使用了Replace(这不需要regex,谢谢CodeInChaos)

以下代码应执行指定的操作:

Regex reg = new Regex(@"[^\p{L}\p{N}]+");//Thanks to Tim Pietzcker for regex
string regexed = reg.Replace("Hello there(hello#)", "");
这使得:

regexed = "Hellotherehello"

使用以下正则表达式可以使用regex.Replace从字符串中删除所有字符

([^A-Za-z0-9\s])

作为替换操作和扩展方法:

public static class StringExtensions
{
    public static string ReplaceNonAlphanumeric(this string text, char replaceChar)
    {
        StringBuilder result = new StringBuilder(text.Length);

        foreach(char c in text)
        {
            if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9')
                result.Append(c);
            else
                result.Append(replaceChar);
        }

        return result.ToString();
    } 
}
您可以使用Linq筛选出所需的字符:

  String source = "Hello there(hello#)";

  // "Hellotherehello"
  String result = new String(source
    .Where(ch => Char.IsLetterOrDigit(ch))
    .ToArray());



因此,不需要正则表达式。

首先定义字母数字的确切含义如何?你只想要A-Z,A-Z,0-9吗?Unicode有更多的字母和数字。通过这种编辑,它看起来更好——收回我的负数。为什么括号中有空格?和
string.Replace
一开始不需要正则表达式。只是要明确一点:你也不需要像
ä
这样的字母吗?我在回答我的问题时考虑了你的提示(见下文)。我尝试了这个…它非常接近,但似乎留下了空格-我也希望它们被去掉!谢谢。不,没有。除非其中有特殊的空格,比如不可破空格ASCII 160(第二个版本也正确地删除了这些空格)
string a=“New:”+t.Replace(@“[^\p{L}\p{N}]+”,”)和a最后是“你好-(efrwef)”-完全不变-我知道我在这里做错了。
string.Replace
不接受正则表达式。AHHH可以解释一切。那么,我如何使用C#中的正则表达式比特和片段实现上面描述的功能呢?虽然我喜欢一般的方法,但它不符合只允许A-Z,A-Z,0-9的要求。它还允许其他字母和数字。unicode中也有10多个数字<代码>是一些示例。抱歉,它仍然是错误的
ToLower
使用当前区域设置。因此,当您在土耳其运行时,它将不允许
I
,而是允许
İ
@CodeInChaos哇。。。我想是我的懒惰让我这么做的。修正:)欢迎如此。一个小小的解释总是让你的答案更有价值。因此,人们往往喜欢知道为什么,而不是如何string.Replace()'不将正则表达式作为argument@PostureOfLearning谢谢你的评论,但你应该看看这个问题。。问题不在于替换方法,而在于正则表达式。方法的用法是从它自己提供的问题中复制出来的,该问题带有有用的正则表达式。请收回您的投票:)我理解这个问题,我意识到这个问题也有无效代码。但是,我接受问题中的无效代码,因为他们正在尝试学习,但我发现答案中的错误代码是不可接受的。这是一个答案,应该有效。当我想解决自己的问题时,你的回答把我引向了错误的方向。话虽如此,如果你想改变它,我很乐意收回选票;)帮你自己一个忙,把这个去掉。很好的补充!如果您想知道它与正则表达式解决方案的相对性能,那将非常有趣。在LinqPad中的一个快速测试表明,即使是一个已编译的正则表达式解决方案,它也与正则表达式解决方案之间的差别可以忽略不计。可读性为我赢得了胜利。看起来非常整洁和可读,如果性能相同,我正在使用它,谢谢。注意:对于像我这样的新程序员,这意味着您需要使用System.Linq添加行
位于文件顶部,以便C#编译器识别方法
Where
([^A-Za-z0-9\s])
var text = "Hello there(hello#)";

var rgx = new Regex("[^a-zA-Z0-9]");

text = rgx.Replace(text, string.Empty);
public static class StringExtensions
{
    public static string ReplaceNonAlphanumeric(this string text, char replaceChar)
    {
        StringBuilder result = new StringBuilder(text.Length);

        foreach(char c in text)
        {
            if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9')
                result.Append(c);
            else
                result.Append(replaceChar);
        }

        return result.ToString();
    } 
}
[TestFixture]
public sealed class StringExtensionsTests
{
    [Test]
    public void Test()
    {
        Assert.AreEqual("text_LaLa__lol________123______", "text LaLa (lol) á ñ $ 123 ٠١٢٣٤".ReplaceNonAlphanumeric('_'));
    }
}
  String source = "Hello there(hello#)";

  // "Hellotherehello"
  String result = new String(source
    .Where(ch => Char.IsLetterOrDigit(ch))
    .ToArray());
  String result = String.Concat(source
    .Where(ch => Char.IsLetterOrDigit(ch)));