什么是最好的去除字符串的方法?

4

我希望您能提供最佳性能的想法来删除/过滤字符串

我手头有:

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

如何以最佳性能方式去除“view(”、“);”和引号?我可以这样做:

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

但这似乎相当不优雅。

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

看起来相当不错

我不想使用正则表达式来完成它;我需要尽可能快地制作应用程序。 提前感谢!:)


这里肯定有一些 LINQ。 - David Heffernan
你为什么不想使用正则表达式? - SoftMemes
你说的“最好”是指“最佳性能”,对吗? - Frédéric Hamidi
正则表达式在这种情况下可能更快... 你需要处理嵌套的括号吗? - Ben Voigt
@Freed:为了最佳性能。 @Frédéric Hamidi:是的,响应已更新。 - The Mask
10个回答

4
你可以使用简单的Linq语句:
```

你可以使用简单的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);

2
希望这能有所帮助。
Regex.Replace("view('512', 3, 159);",@"[(view)';]","")

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

1
请使用以下内容:
            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());

问题在于这可能是最快的方法(无论如何都值得检查)。 - Jon Egerton
如果正则表达式确实更快,我会恢复它,尽管我相信这不会有太大的区别。 - Peter O.
事实证明,在运行每种方法200,000次后,先前在此处的正则表达式要慢两倍以上。 - Peter O.

1

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

1
    var result = new string(Input.ToCharArray().
SkipWhile (i => i != '\'').
TakeWhile (i => i != ')').ToArray());

1
为什么不想使用正则表达式? 正则表达式已经被大量优化,比任何手写的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*)?)"

我知道你说你不想使用正则表达式,但我认为你犯了一个错误。在初始学习曲线之后,编写一个好的正则表达式比手写的替代方案更快、更清晰、更干净,而且它的性能也比这里的函数式和命令式答案更快。 - Dunes

0

更通用

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

    var result = Input.Substring(statingPoint, Input.IndexOf(')') - statingPoint);
}

0

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


4
这不会去除在512之后的引号。 - Femaref
我猜测问题是如何提取引号中的字符串部分,而不是如何在特定示例中提取该特定范围? - SoftMemes
@Femaref,或者在“512”之前的那个。 - Frédéric Hamidi
这将导致ArgumentOutOfRangeException。您无法获取超出字符串末尾的字符。 - Guffa
@Guffa:已修复,我忘记了第二个参数是长度而不是结束位置。 - gordy

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