【问题标题】:How do I strip non-alphanumeric characters (including spaces) from a string?如何从字符串中去除非字母数字字符(包括空格)?
【发布时间】:2012-01-08 16:34:36
【问题描述】:

如何在 C# 中使用 Replace 去除字符串中的非字母数字字符和松散空格?

我想保留 a-z、A-Z、0-9,仅此而已(甚至不包括 " " 空格)。

"Hello there(hello#)".Replace(regex-i-want, "");

应该给

"Hellotherehello"

我已尝试"Hello there(hello#)".Replace(@"[^A-Za-z0-9 ]", "");,但空格仍然存在。

【问题讨论】:

  • 先定义一下字母数字的确切含义如何?你只想要 A-Z、a-z、0-9 吗? Unicode 有更多的字母和数字。
  • 有了那个编辑,它看​​起来好多了 - 收回我的负票。
  • 为什么你的括号里有空格?而string.Replace 一开始就没有使用正则表达式。
  • 绝对清楚:你也不想要ä这样的字母吗?
  • 我在回答我的问题时考虑了您的提示(见下文)。

标签: c# asp.net .net regex


【解决方案1】:

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

result = Regex.Replace("Hello there(hello#)", @"[^A-Za-z0-9]+", "");

应该可以。 + 通过一次匹配多个连续的非字母数字字符而不是一个一个匹配,使正则表达式更加高效。

如果您也想保留非 ASCII 字母/数字,请使用以下正则表达式:

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

离开

BonjourmesélèvesGutenMorgenliebeSchüler

而不是

BonjourmeslvesGutenMorgenliebeSchler

【讨论】:

  • 我试过这个......它非常接近,但它似乎留下了空格 - 我也希望它们被剥离!谢谢。
  • 不,它没有。除非你有特殊的空间,比如不可破坏的空间 ASCII 160(第二个版本也正确地删除了这些)。
  • 嗯,我尝试了以下操作:string t = "hello there - ( efrwef )";string a = "New: " + t.Replace(@"[^\p{L}\p{N}]+", "");,结果是“你好 - (efrwef)” - 完全没有改变 - 我知道我在这里做错了。
  • string.Replace 不需要正则表达式。
  • AHHH 这可以解释一切。那么,我怎么能用 C# 中的正则表达式来做上面描述的事情呢?
【解决方案2】:

您可以使用 Linq 过滤掉所需的字符:

  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)));  

所以你不需要正则表达式

【讨论】:

  • 伟大的补充!知道这与正则表达式解决方案的相对性能会很有趣。走出大门,它读起来好多了。
  • 在 LinqPad 中的快速测试表明,这与编译的正则表达式解决方案之间的差异可以忽略不计。可读性对我来说是赢家。
  • 看起来非常整洁易读,如果性能相同,我正在使用它,谢谢。 NB 对于像我这样的新程序员,这意味着您需要在文件顶部添加行 using System.Linq; 以便 C# 编译器识别方法 Where
【解决方案3】:

或者你也可以这样做:

    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();
    }

用法:

string text = SomeClass.RemoveNonAlphanumeric("text LaLa (lol) á ñ $ 123 ٠١٢٣٤");

//text: textLaLalol123

【讨论】:

  • 虽然我喜欢一般的方法,但它不符合只允许 A-Z、a-z、0-9 的要求。它也允许其他字母和数字。
  • unicode也有10多位数字。 ٠١٢٣٤ 是一些例子。
  • 对不起,还是错了。 ToLower 使用当前语言环境。所以当你在土耳其跑步时,它不会允许I,而是允许İen.wikipedia.org/wiki/Dotted_and_dotless_I
  • @CodeInChaos 哇...猜猜我的懒惰让我这样做了。固定:)
【解决方案4】:

上面的错误是错误地使用了 Replace(它不需要正则表达式,感谢 CodeInChaos)。

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

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

这给出了:

regexed = "Hellotherehello"

【讨论】:

    【解决方案5】:

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

    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('_'));
        }
    }
    

    【讨论】:

      【解决方案6】:
      var text = "Hello there(hello#)";
      
      var rgx = new Regex("[^a-zA-Z0-9]");
      
      text = rgx.Replace(text, string.Empty);
      

      【讨论】:

      • 欢迎您。一点解释总是让你的答案更有价值。在 SO 上,人们倾向于想知道为什么,而不是仅仅知道如何。 ;)
      【解决方案7】:

      使用下面的正则表达式,使用 Regex.Replace 从字符串中删除所有字符

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

      【讨论】:

      • 'string.Replace()' 不将正则表达式作为参数
      • @PostureOfLearning 谢谢你的评论,但你应该看看这个问题。问题不是关于替换方法,而是关于正则表达式。方法的用法是从它自己提供的有用正则表达式的问题中复制而来的。请收回您的投票:)
      • 我理解这个问题,我意识到这个问题也有无效的代码。但是,我接受问题中的无效代码,因为他们正在尝试学习,但我发现答案中的错误代码是不可接受的。这是一个答案,应该可以工作。在寻求解决我自己的问题时,您的回答将我引向错误的方向。话虽如此,如果您想更改它,我很乐意收回投票;)
      【解决方案8】:

      在 .Net 4.0 中,您可以使用 String 类的 IsNullOrWhitespace 方法来删​​除所谓的空白字符。请看这里http://msdn.microsoft.com/en-us/library/system.string.isnullorwhitespace.aspx 然而,正如@CodeInChaos 指出的那样,有很多字符可以被视为字母和数字。如果只想查找 A-Za-z0-9,可以使用正则表达式。

      【讨论】:

      • 帮自己一个忙,删除它。
      猜你喜欢
      • 2011-11-08
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      相关资源
      最近更新 更多