1

我有一个由prefixatype和 name 组成的名称,我想检索该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

4 回答 4

4

您可以使用允许您指定零件数量的重载string.Split()

string fileName = "Prefix-Type-hello-j---.xml"; 
string withoutExtension = Path.GetFileNameWithoutExtension(str);
var parts = str.Split(new[]{'-'}, 3);
string name = parts[2];
于 2013-02-02T13:59:01.613 回答
2

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

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

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

string name = str.Split(new[]{'-'}, 3)[2];
于 2013-02-02T13:53:45.383 回答
0

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

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

前两个捕获组使用前缀和类型,然后命名组使用名称,直到扩展启动。

这段代码假设总是有一个匹配,如果没有它会抛出一个空引用异常。

请参阅正则表达式匹配

于 2013-02-02T14:44:14.003 回答
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);
于 2013-02-02T14:08:03.157 回答