1

「d:\tmp\abc_list.csv」「d:\tmp\xyzx_list.csv」「d:\tmp\qwert_list.csv」のような文字列があります。ファイル名の最初の部分を取得する必要があります: abx、xyzc、qwert。私は今それを次のように行います:

 string name = filename.Substring(filename.LastIndexOf('\\') + 1 , filename.IndexOf('_') - filename.LastIndexOf('\\') - 1);

もっと簡単で良い方法があるはずだと思います。それは何ですか?

4

4 に答える 4

2

あなたのソリューションは素晴らしいですが、ファイル名の別の部分、たとえばディレクトリ パスの一部にアンダースコアが含まれていると、うまくいきません。この問題を回避するには、少し変更する必要があります。

int pos = filename.LastIndexOf('\\') + 1;
string name = filename.Substring(pos , filename.IndexOf('_', pos) - pos);

ソリューションが素晴らしく、堅牢で、理解しやすい場合、短いソリューションを選択する理由はありません。もちろん、正規表現を使用することもできますが、結果の 1 行のソリューションははるかに読みにくくなります。

var res = Regex.Matches(s, @"(?<=\\)[^_\\]*(?=_[^\\]*$)")[0].Value;

これは ideone でのこのソリューションのデモです。

于 2013-08-30T11:42:12.507 に答える
1

このようなもの:

string str = @"d:\tmp\abc_list.csv";

// The preferred way to manipulate paths is to use the Path.* methods
string str2 = Path.GetFileNameWithoutExtension(str);

int ix = str2.LastIndexOf('_');

if (ix != -1)
{
    str2 = str2.Remove(ix);
}
于 2013-08-30T11:43:45.510 に答える