在不同的特定字符之前返回单词

时间:2014-04-26 17:37:57

标签: c#

我有以下代码在comma之前得到了这个词。

static string GetString(string input)
{
    try
    {
        return input.Substring(0, input.IndexOf(','));
    }
    catch
    {
        return string.Empty;
    }
}

示例:

  

输入:Lennon,John

     

结果:列侬

问题是我需要指定多个字符;不只是comma

例如:我需要在以下内容之前获取所有单词:,([!

我该怎么做?

4 个答案:

答案 0 :(得分:3)

改为使用IndexOfAny,它允许您指定一个字符数组:

return input.Substring(0, input.IndexOfAny(new[] { ',', '(', '[', '!' }));

我还建议您不要使用try / catch块,因为它曾用于捕获异常,而且这不是真正的"例外"情况。

var index = input.IndexOfAny(new[] { ',', '(', '[', '!' });

return index > -1 ? input.Substring(0, index) : string.Empty;

答案 1 :(得分:2)

使用string.IndexOfAny

但是,我更愿意在您的方法中添加一个安全网,而不是依赖异常来驱动代码流

static string GetString(string input)
{
     int pos = input.IndexOfAny(new char[] {',','(', '[', '!'});
     return (pos >= 0 ? input.Substring(0, pos) : string.Empty;
}

使用异常来控制代码流是一种不好的做法。在性能方面,例外是非常昂贵的。在你的情况下,我真的建议将代码分成两行并测试结果,如果字符根本不存在则返回desidered输出。

只是为了证明最坏情况下的差异:

void Main()
{
    string input = "test";
    string result;
    Stopwatch sw = new Stopwatch();
    sw.Start();
    for(int x = 0; x < 1000000; x++)
        result = GetString(input);

    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds);

    sw = new Stopwatch();
    sw.Start();
    for(int x = 0; x < 100000; x++)
        result = GetString2(input);

    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds);
}

string GetString(string input)
{
     int pos = input.IndexOfAny(new char[] {',','(', '[', '!'});
     return (pos >= 0 ? input.Substring(0, pos) : string.Empty);
}

string GetString2(string input)
{
    try
    {
       return input.Substring(0, input.IndexOfAny(new [] { ',', '(', '[', '!' }));
    }
    catch
    {
        return string.Empty;
    }
}

第一个循环在241毫秒内执行100万次,第二个循环在5300毫秒内执行十万次(在我的机器上,YMMV)

答案 2 :(得分:2)

您可以使用类似IndexOf的{​​{3}},但需要匹配一系列字符:

static string GetString(string input)
{
    try
    {
       return input.Substring(0, input.IndexOfAny(new [] { ',', '(', '[', '!' }));
    }
    catch
    {
        return string.Empty;
    }
}

答案 3 :(得分:0)

您可以使用正则表达式或string.Split。我更喜欢使用string.split。正则表达式将超大。

代码如下: string [] inputSplit = input.Split(new [] {&#34;,&#34;,&#34;(&#34;,&#34; [&#34;,&#34;!&## 34;},StringSplitOptions.None);