我的名字由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#中做同样的事情?
答案 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