获得字符串一部分的有效方法

时间:2013-02-02 13:47:09

标签: c#

我的名字由prefix type和名称组成,我想要检索name部分。

Prefix始终保持不变,但Type可以更改。

我有以下代码来获取名称部分:

            string prefix = "Prefix-";
            string str =prefix + "Type-hello-j---.xml"; 
            str = Path.GetFileNameWithoutExtension(str);
            str = str.Substring(prefix.Length);
            str = str.Substring(str.IndexOf('-') + 1); 

在上面的例子中,名称部分是:hello-j--- 有没有有效/更好的方法在C#中做同样的事情?

4 个答案:

答案 0 :(得分:4)

您可以使用overload of string.Split() that lets you specify the number of parts

string fileName = "Prefix-Type-hello-j---.xml"; 
string withoutExtension = Path.GetFileNameWithoutExtension(str);
var parts = str.Split(new[]{'-'}, 3);
string name = parts[2];

答案 1 :(得分:2)

如果这始终是字符串的结构,那么这将起作用:

string name =  str.Split(new[]{'-'})[2];

我假设你只想要“你好”。如果您想要名称的其余部分,可以使用重载方法@KingCronus建议:

string name = str.Split(new[]{'-'}, 3)[2];

答案 2 :(得分:0)

您还可以创建一个与String.IndexOf类似的扩展函数,但它获取指定字符第n次出现的位置:

public static int IndexOfWithCount(this string input, char character, int occurenceNumber)
{
    int count = 0;
    for (int numCaracter = 0; numCaracter < input.Length; numCaracter++)
        if (input[numCaracter] == character)
        {
            count++;
            if (count == occurenceNumber)
                return numCaracter;
        }

    return -1;
}

使用它:

string nameWithoutExt = Path.GetFileNameWithoutExtension(str);
string result = nameWithoutExt.Substring(nameWithoutExt.IndexOfWithCount('-', 2) + 1);

答案 3 :(得分:0)

这取决于你如何定义效率,但如果代码行符合您的定义如何:

var str = "prefix-Type-hello-j---.xml"; 
var name = Regex.Match(str, @"(.+?-)(.+?-)(?<name>.+)\.").Groups["name"].Value;

前两个捕获组使用前缀和类型,然后namedgroup使用该名称,直到扩展开始。

此代码假定总是匹配,如果不存在,则会抛出空引用异常。

请参阅Regex.Match