【问题标题】:string replacing - C#字符串替换 - C#
【发布时间】:2010-12-06 07:25:21
【问题描述】:

假设我有一个包含数字和其他字符的字符串。

我只想将字符串简化为数字。

F.e.从 23232-2222-d23231 到 23232222223231

这可以用 string.replace() 来完成吗?

如果没有,最简单最短的方法是什么?

10 倍!

【问题讨论】:

    标签: c# string


    【解决方案1】:

    你可以使用 LINQ:

    string allDigits = new String(input.Where(c => Char.IsDigit(c)).ToArray());
    

    【讨论】:

      【解决方案2】:

      是的,您可以使用 String.replace,但使用正则表达式会更明智,这样您就可以更轻松地匹配更多条件。

      【讨论】:

        【解决方案3】:

        有很多可能性,从正则表达式到自己处理文本。我会这样做:

        Regex.Replace(input, @"\D+", "")
        

        【讨论】:

        • 正是我要写的。确保存储返回值。 string str = Regex.Replace(input, "\D+", "");
        • 这将取代“-”和“d”?这并不像我想象的那么难。
        • \D 是查找任何非数字字符的表达式。然后将它们替换为空字符“”。
        • 是的,因为它将所有非数字字符系列(\d 是数字,\D 是非数字)替换为空字符串,只剩下数字字符。
        【解决方案4】:

        试试

        string str="23232-2222-d23231";
        str=Regex.Replace(str, @"\D+", String.Empty);
        

        【讨论】:

          【解决方案5】:

          好吧,你会得到大约 874355876234857 个使用 String.Replace 和 Regex.Replace 的答案,所以这里有一个 LINQ 解决方案:

          code = new String((from c in code where Char.IsDigit(c) select c).ToArray());
          

          或者使用扩展方法:

          code = new String(code.Where(c => Char.IsDigit(c)).ToArray());
          

          【讨论】:

          • +1 表示原创,但我很想知道与 80 亿个正则表达式解决方案相比,它的表现如何。
          • @Matthew:我做了一个快速测试,有点令人惊讶的是,它比 Regex 版本三倍。
          • 更短:code = new String(code.Where(Char.IsDigit).ToArray());
          • @Guffa:并不完全令人惊讶,但您的解决方案是使用相同的Regex 对象,使用静态Replace 方法,还是重新创建了几十个Regex 对象?第一个选项将是最快的,但可能不代表现实世界的使用。
          • @Matthew:我使用了静态方法。我刚刚从 Lucero 的答案中复制了代码。
          【解决方案6】:

          采样的正则表达式是最简单和最短的。

          不知道下面会不会更快?

                      string sample = "23232-2222-d23231";
                      StringBuilder resultBuilder = new StringBuilder(sample.Length);
                      char c;
                      for (int i = 0; i < sample.Length; i++)
                      {
                          c = sample[i];
                          if (c >= '0' && c <= '9')
                          {
                              resultBuilder.Append(c);
                          }
                      }
                      Console.WriteLine(resultBuilder.ToString());
                      Console.ReadLine();
          

          猜测这取决于一些事情,包括字符串长度。

          【讨论】:

            【解决方案7】:

            您可以使用简单的扩展方法:

                public static string OnlyDigits(this string s)
                {
                    if (s == null)
                        throw new ArgumentNullException("null string");
            
                    StringBuilder sb = new StringBuilder(s.Length);
                    foreach (var c in s)
                    {
                        if (char.IsDigit(c))
                            sb.Append(c);
                    }
                    return sb.ToString();
                }
            

            【讨论】:

              【解决方案8】:

              您可以使用正则表达式。

              string str = "sdfsdf99393sdfsd";
              str = Regex.Replace(str, @"[a-zA-Z _\-]", "");
              

              我以前用它只返回字符串中的数字。

              【讨论】:

              • 如果我有string str = "foo/234335"?哎呀。
              • 我只是想举一个使用正则表达式的例子。在特定情况下,我从输入中获取的代码是受控的,因此不必为您注意到的情况转义。由于试图保持示例代码较小,因此我没有发布整个例程。我认为任何远程熟悉正则表达式的人都会意识到他们必须为他们想要实现的目标创建一个合适的表达式。我想我应该添加一个注释,即表达式本身不应被视为处理人们可能遇到的每一种情况的一种手段。
              • 如果 OP 知道如何使用正则表达式,我相信他们可以推测这将是使用它们的绝佳案例。顺便说一句,谢谢你对我的工作答案投反对票。很高兴知道有人关心。
              • 欢迎您。我刚刚投票支持你。没必要对你做我不欣赏的事,我的仓促反应。看我在乎。
              【解决方案9】:

              我会使用正则表达式。

              看到这个帖子Regex for numbers only

              【讨论】:

                【解决方案10】:

                string.Replace() 不可能(很容易)。最简单的解决方案是以下函数/代码:

                public string GetDigits(string input)
                {
                    Regex r = new Regex("[^0-9]+");
                    return r.Replace(input, "");
                }
                

                【讨论】:

                  【解决方案11】:

                  最好的方法是使用正则表达式。你的例子是:

                  RegEx.Replace("23232-2222-d23231", "\\D+", "");
                  

                  【讨论】:

                  • 请使用+或不使用量词。使用 * 会导致大量 0 长度匹配。
                  【解决方案12】:

                  最简单的方法是使用替换。

                   string test = "23232-2222-d23231";
                   string newString = test.Replace("-","").Replace("d","");
                  

                  但使用 REGEX 会更好,但更难。

                  【讨论】:

                  • 这对于仅此一个示例来说太专业了。正则表达式并不是真的更难,并且会捕获所有非数字值。
                  猜你喜欢
                  • 2013-04-01
                  • 2013-05-26
                  • 2011-10-20
                  • 2014-04-11
                  • 2014-07-30
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多