1

FFS\D46_24\43_2最初の円記号と最後のアンダースコアの間のテキストを返したいような文字列がいくつかあります。上記の例の場合、D46_24\43

以下のコードを試しましたが、引数が範囲外の実行になります。

    public string GetTestName(string text)
    {
        return text.Remove(
            text.IndexOf("\\", StringComparison.InvariantCultureIgnoreCase)
            ,
            text.LastIndexOf("_", StringComparison.InvariantCultureIgnoreCase)
            );
    }
4

7 に答える 7

8

2 番目のパラメーターはカウントであり、終了インデックスではありません。さらに、文字列の一部を分離する正しい方法はSubstringand notRemoveです。だからあなたはそれを次のように書く必要があります

var start = text.IndexOf("\\", StringComparison.InvariantCultureIgnoreCase);
var end = text.LastIndexOf("_", StringComparison.InvariantCultureIgnoreCase);

// no error checking: assumes both indexes are positive
return text.Substring(start + 1, end - start - 1);
于 2012-08-06T12:15:47.750 に答える
3

2 番目のパラメーターは終了インデックスではありません。削除する文字数にする必要があります。

このオーバーロードのドキュメントを参照してください。

int startIndex = text.IndexOf("\\", StringComparison.InvariantCultureIgnoreCase);
int endIndex = text.LastIndexOf("_", StringComparison.InvariantCultureIgnoreCase)

return text.Remove(startIndex, endIndex - startIndex);
于 2012-08-06T12:16:14.633 に答える
1

これは正規表現の仕事です。

var regex = new Regex( @"\\(.+)_" );
var match = regex.Match( @"FFS\D46_24\43_2" );

if( match.Success )
{
    // you can loop through the captured groups to see what you've captured
    foreach( Group group in match.Groups )
    {
        Console.WriteLine( group.Value );
    }
}
于 2012-08-06T12:17:19.153 に答える
1

正規表現を使用します:

Match re = Regex.Match("FFS\D46_24\43_2", @"(?<=\\)(.+)(?=_)");
if (re.Success)
{
    //todo
}
于 2012-08-06T12:18:22.620 に答える
0

Remove の代わりに Substring を使用する必要があります。これを試して:

public static string GetTestName(string text)
    {
        int startIndex = text.IndexOf("\\", StringComparison.InvariantCultureIgnoreCase);
        int endIndex = text.LastIndexOf("_", StringComparison.InvariantCultureIgnoreCase);

        if (startIndex < 0 || endIndex < 0)
            throw new ArgumentException("Invalid string: no \\ or _ found in it.");

        if (startIndex == text.Length - 1)
            throw new ArgumentException("Invalid string: the first \\ is at the end of it.");

        return text.Substring(startIndex + 1, 
                              endIndex - startIndex - 1);
    }
于 2012-08-06T12:19:48.057 に答える
0
string text = @"FFS\D46_24\43_2";
int startIndex = text.IndexOf("\\", StringComparison.InvariantCultureIgnoreCase),
    lastIndex  = text.LastIndexOf("_", StringComparison.InvariantCultureIgnoreCase);

return text.Substring(startIndex + 1, lastIndex-startIndex-1);
于 2012-08-06T12:20:13.407 に答える
0

string.Remove() の 2 番目の引数は、削除する要素の数であり、削除する上限のインデックスではありません。

http://msdn.microsoft.com/en-us/library/d8d7z2kk.aspxを参照してください

編集:そして他の人が指摘したように、Remove()ではなくSubstring()を使用したい

http://msdn.microsoft.com/en-us/library/system.string.substring%28v=vs.71%29.aspxを参照してください。

于 2012-08-06T12:20:23.827 に答える