【问题标题】:What's the best way to remove strings?删除字符串的最佳方法是什么?
【发布时间】:2011-10-03 04:35:26
【问题描述】:

我需要具有最佳性能的想法来删除/过滤字符串

我有:

string Input = "view('512', 3, 159);";

删除“view(”和“);”的最佳性能方法是什么和报价? 我可以这样做:

Input = Input.Replace("view(","").Replace("'","").Replace("\"","").Replace(");",""); 

但它似乎相当不雅。

Input.Split('(')[1].Split(')')[0].Replace("'", "");

好像好多了

我不想用正则表达式来做;我需要尽我所能做出更快的应用程序。 提前致谢! :)

【问题讨论】:

  • 这里一定有一些 linq
  • 为什么不想使用正则表达式?
  • 你说的是best 和best performance 一样,对吧?
  • 在这种情况下,Regex 可能更快...您需要处理嵌套括号吗?
  • @Freed:表现最佳@Frédéric Hamidi:是的,回复已更新

标签: c# .net string performance


【解决方案1】:

你可以使用一个简单的 linq 语句:

string Input = "view('512', 3, 159);";

string output = new String( Input.Where( c => Char.IsDigit( c ) || c == ',' ).ToArray() );

输出:512,3,159

如果你想要空格,只需在 where 子句中添加一个检查。

【讨论】:

    【解决方案2】:

    您可以只使用Substring 来删除view( 和);:

    Input.Substring(5, Input.Length - 7)
    

    除此之外,它看起来相当有效。纯字符串操作得到了很好的优化。

    所以:

    Input =
      Input.Substring(5, Input.Length - 7)
      .Replace("'", String.Empty)
      .Replace("\"", String.Enmpty);
    

    【讨论】:

      【解决方案3】:
      char[] Output = Input.SkipWhile(x => x != '(') // skip before open paren
                           .Skip(1)                  // skip open paren
                           .TakeWhile(x => x != ')') // take everything until close paren
                           .Where(x => x != '\'' && x != '\"') // except quotes
                           .ToArray();
      return new String(Output);
      

      【讨论】:

        【解决方案4】:

        希望对你有帮助

        Regex.Replace("view('512', 3, 159);",@"[(view)';]","")
        

        【讨论】:

          【解决方案5】:

          IndexOf、LastIndexOf 和 Substring 可能是最快的。

          string Input = "view('512', 3, 159);"; 
          int p1 = Input.IndexOf('(');
          int p2 = Input.LastIndexOf(')');
          Input = Input.Substring (p1 + 1, p2 - p1 - 1);
          

          【讨论】:

            【解决方案6】:

            使用以下内容:

                        System.Text.StringBuilder sb=new System.Text.StringBuilder();
                    int state=0;
                    for(var i=0;i<Input.Length;i++){
                        switch(state){
                            case 0: // beginning
                                if(Input[i]=='('){
                                    state=1; // seen left parenthesis
                                }
                                break;
                            case 2: // seen end parentheses
                                break; // ignore
                            case 1:
                                if(Input[i]==')'){
                                    state=2; // seen right parentheses
                                } else if(Input[i]!='\''){
            
                                    sb.Append(Input[i]);
                                }
                                break;
                        }
                    }
                    Console.WriteLine(sb.ToString());
            

            【讨论】:

            • 麻烦的是这可能是最快的(无论如何值得检查)
            • 如果它确实更快,我会恢复正则表达式,但我相信它不会有太大区别。
            • 事实证明,在每个方法运行 200,000 次后,之前的正则表达式的速度是原来的两倍多。
            【解决方案7】:
                var result = new string(Input.ToCharArray().
            SkipWhile (i => i != '\'').
            TakeWhile (i => i != ')').ToArray());
            

            【讨论】:

              【解决方案8】:

              为什么不想使用正则表达式?正则表达式经过大量优化,比任何手写 hack 都要快。

              这是 java(因为我运行的是 linux,因此无法运行 c#),但我希望你明白。

              input.replace("view(","").replace("'","").replace("\"","").replace(");",""); 
              

              上面的一百万次重复在我的计算机上运行大约 6 秒。而下面的正则表达式运行时间约为 2 秒。

              // create java's regex matcher object
              // matcher is looking for sequences of digits (valid integers)
              Matcher matcher = Pattern.compile("(\\d+)").matcher(s);
              StringBuilder builder = new StringBuilder();
              // whilst we can find matches append the match plus a comma to a string builder
              while (matcher.find()) {
                  builder.append(matcher.group()).append(',');
              }
              // return the built string less the last trailing comma
              return builder.substring(0, builder.length()-1);
              

              如果您想查找有效的小数以及整数,请改用以下模式。虽然它的运行速度比原来的稍慢。

              "(\\d+(\\.\\d*)?)"
              

              【讨论】:

              • 我知道你说你不想使用正则表达式,但我认为你犯了一个错误。在最初的学习曲线之后,编写一个好的正则表达式比手写的替代品更快、更清晰、更干净,但它也比这里的函数式和命令式答案执行得更快。
              【解决方案9】:

              更通用

              void Main()
              {
                  string Input = "view('512', 3, 159);";
                  var statingPoint = Input.IndexOf('(') + 1;
              
                  var result = Input.Substring(statingPoint, Input.IndexOf(')') - statingPoint);
              }
              

              【讨论】:

                【解决方案10】:

                最快的方法是Input = Input.Substring(5, Input.Length - 7)

                【讨论】:

                • 这不会去掉 512 之后的引用。
                • 我认为问题是如何在引号中提取字符串的一部分,而不是如何在特定示例中提取特定范围?
                • @Femaref,或者512之前的那个。
                • 这将导致 ArgumentOutOfRangeException。你不能得到超出字符串末尾的字符。
                • @Guffa: 固定,我忘了第二个参数是长度而不是 endPos
                猜你喜欢
                • 2011-05-31
                • 2023-03-25
                • 2010-10-17
                • 1970-01-01
                • 2015-01-31
                • 2014-03-29
                • 2023-01-11
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多