C# 返回不同特定字符前的单词

C# 返回不同特定字符前的单词,c#,C#,我有下面的代码,它获取逗号前面的单词 static string GetString(string input) { try { return input.Substring(0, input.IndexOf(',')); } catch { return string.Empty; } } 例如: 输入:列侬,约翰 结果:列侬 问题是我需要指定多个字符;不仅仅是逗号 static string GetString

我有下面的代码,它获取逗号前面的单词

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

输入:列侬,约翰

结果:列侬

问题是我需要指定多个字符;不仅仅是逗号

static string GetString(string input)
{
    try
    {
        return input.Substring(0, input.IndexOf(','));
    }
    catch
    {
        return string.Empty;
    }
}
例如:我需要获取以下内容之前的所有单词:
,([!

我如何做到这一点?

使用

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

static string GetString(string input)
{
     int pos = input.IndexOfAny(new char[] {',','(', '[', '!'});
     return (pos >= 0 ? input.Substring(0, pos) : string.Empty;
}
使用异常来控制代码流是一种不好的做法。异常在性能方面非常昂贵。在您的情况下,我建议将代码分成两行,如果字符根本不存在,则测试返回指定输出的结果

为了演示最坏情况下的差异:

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;
    }
}
void Main()
{
字符串输入=“测试”;
字符串结果;
秒表sw=新秒表();
sw.Start();
对于(int x=0;x<1000000;x++)
结果=GetString(输入);
sw.Stop();
控制台写入线(软件延迟毫秒);
sw=新秒表();
sw.Start();
对于(int x=0;x<100000;x++)
结果=GetString2(输入);
sw.Stop();
控制台写入线(软件延迟毫秒);
}
字符串GetString(字符串输入)
{
int pos=input.IndexOfAny(新字符[]{',','(',[',!');
返回(位置>=0?输入。子字符串(0,位置):字符串。空);
}
字符串GetString2(字符串输入)
{
尝试
{
返回input.Substring(0,input.IndexOfAny(new[]{',','(','[','!'}));
}
抓住
{
返回字符串。空;
}
}

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

改用
IndexOfAny
,它允许您指定字符数组:

return input.Substring(0, input.IndexOfAny(new[] { ',', '(', '[', '!' }));
我还建议您不需要使用
try/catch
块,因为它用于捕获异常,这并不是真正的“异常”情况

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

return index > -1 ? input.Substring(0, index) : string.Empty;
您可以使用类似于IndexOf但需要匹配字符数组的:

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

您可以使用regex或string.Split。我更喜欢使用string.Split。regex的尺寸会过大

代码如下所示:
字符串[]inputSplit=input.Split(新的[]{“,”,“(“,“[”,“!”},StringSplitOptions.None)

你能更具体一点吗?例如,如果输入是
列侬!约翰,杰克
输出应该是什么?空捕获…真不敢相信还会发生这种情况!@Selman22谢谢!基本上,我在寻找第一个单词,但我需要能够指定索引字符。在你的例子中,我只对列侬感兴趣。我正在处理的数据每个字符串中只包含一个字符。它可以是一个字符,也可以是另一个字符,但不能像您的示例那样同时包含两个字符。@UnaverageGuy-okey-then
IndexOfAny
是正确的选择。我只是想sure@UweKeim最糟糕的是,它被用来控制代码流,简单的if可以避免这样一个昂贵的异常,因为它不会使用
试试Catch
。谢谢!