文字列から部分文字列を取り出す処理は、C# 8.0より以前はsubstring()を使っていましたが、C# 8.0からは、インデクサーの範囲指定を使ってとても簡潔に書けるようになりました。
string line = "01234567";
var s = "";
s = line[0..3]; // 012
s = line.Substring(0, 3); // 012
s = line[1..4]; // 123
s = line.Substring(1, 4); // 1234
substring()は、開始インデックスと取り出す文字列の長さを指定できましたが、インデクサーの範囲指定では、開始インデックスと終了インデックスを指定します。終了インデックスについては、指定したインデックスの前までを取り出すことになります。[1..4]ならインデックス1から3までとなります。
さらに様々な範囲指定のバリエーションが使えます。
string str = "01234567";
string r;
// [i..] iから最後まで
r = str[3..]; // 34567
cout(r);
// [..i] 最初から i - 1 まで
r = str[..3]; // 012
cout(r);
// [..^i] 最初からはじめて、最後から数えてi番目まで
r = str[..^2]; // 012345
cout(r);
// [^i..] 最後からi番目からはじめて最後まで
r = str[^3..]; // 567
cout(r);
このようにインデックスによる範囲指定はシンプルでわかりやすいので、これから書くコードでSubstring()を使う理由はないと思います。ただし、範囲指定の終了インデックスは、インデックスで指定した要素の一つ前までなので注意が必要です。
string str1 = "DotNetC-Sharp";
void cout(string s) => Console.WriteLine(s);
str = str1.Substring(0, 3);
var str = str1[0..3];
cout(str); // Dot
str = str1[3..6];
cout(str); // Net
str = str1[7..];
cout(str); // -Sharp
str = str1[^6..];
cout(str); // -Sharp
str = str1[0..^3];
cout(str); // DotNetC-Sh
str = str1[1..^1];
cout(str); // otNetC-Shar
Substringを使った部分文字列
比較としてSubstringを使って部分文字列を取り出す方法を示しておきます。
string Substring(int startIndex)
: 指定された開始インデックスから文字列の末尾までの部分文字列を返します。 string Substring(int startIndex, int length)
: 指定された開始インデックスから、指定された長さの部分文字列を返します。
string originalString = "Hello, World!";
// インデックス0から5文字
string sub_1 = originalString.Substring(0, 5);
Console.WriteLine($"Substring(0, 5): {sub_1}");
// インデックス7から最後まで
string sub_2 = originalString.Substring(7);
Console.WriteLine($"Substring(7): {sub_2}");
# Substring(0, 5): Hello
# Substring(7): World!
コメント