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

本文关键字:返回 单词 字符 | 更新日期: 2023-09-27 18:00:14

我有以下代码,它获取comma之前的单词。

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

示例:

输入:Lennon,John

结果:Lennon

问题是我需要指定多个字符;而不仅仅是CCD_ 2。

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

我该怎么做?

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

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

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

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

var index = input.IndexOfAny(new[] { ',', '(', '[', '!' });
return index > -1 ? input.Substring(0, index) : string.Empty;

您可以使用字符串。IndexOfAny类似于IndexOf,但需要一个字符数组来匹配:

static string GetString(string input)
{
    try
    {
       return input.Substring(0, input.IndexOfAny(new [] { ',', '(', '[', '!' }));
    }
    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;
    }
}

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

您可以使用正则表达式或字符串。分裂我更喜欢使用字符串split。正则表达式会过大。

代码如下所示:string[]inputSplit=输入。Split(new[]{",","(","[","!"},StringSplitOptions.None);