1

prefixaとnameで構成された名前があります。パーツ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

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

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 に答える
0

効率的な定義方法によって異なりますが、コード行が定義に適合する場合は、次のようにします。

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

最初の2つのキャプチャグループはプレフィックスとタイプを消費し、次にnamedgroupは拡張が開始するまで名前を消費します。

このコードは、一致が常に存在することを前提としています。一致しない場合は、nullreference例外がスローされます。

Regex.Matchを参照してください

于 2013-02-02T14:44:14.003 に答える