Substring mengembalikan string baru yang dibuat dari sebagian string yang sudah ada. Method ini punya dua overload:
s.Substring(startIndex): daristartIndexsampai akhir.s.Substring(startIndex, length): sebanyaklengthkarakter, mulai daristartIndex.
Indeks dimulai dari 0, dan argumen keduanya adalah panjang, bukan posisi akhir. Itulah perbedaannya dengan substring(start, end) di JavaScript dan substring(begin, end) di Java, dan menjadi sumber banyak bug selisih indeks saat kode dipindahkan dari bahasa lain.
Output:
4271-BLK
SHOE
4271
BLK
0
SHOE-4271-BLK
Seperti semua method string, Substring tidak mengubah string aslinya; ia mengembalikan string baru, jadi simpan hasilnya.
ArgumentOutOfRangeException dan cara menghindarinya
Substring melempar ArgumentOutOfRangeException jika rentang yang diminta tidak muat di dalam string: startIndex negatif, startIndex lebih besar dari Length, length negatif, atau startIndex + length lebih besar dari Length. Tidak ada pemotongan diam-diam, berbeda dengan slice di Python.
Output:
Substring(2, 4) -> "ffee"
Substring(2, 5) -> ArgumentOutOfRangeException
Substring(6) -> ""
Substring(7) -> ArgumentOutOfRangeException
Substring(-1) -> ArgumentOutOfRangeException
Substring(0, 10) -> ArgumentOutOfRangeException
Pengaman yang biasa dipakai adalah membatasi panjangnya sesuai sisa string dengan Math.Min:
Output:
ffee
ea
[]
[]
Memanggil Substring pada string null melempar NullReferenceException, bukan ArgumentOutOfRangeException, itulah sebabnya helper di atas memeriksa null lebih dulu.
n karakter pertama dan terakhir
Mengambil awalan atau akhiran adalah pemakaian Substring yang paling umum. Keduanya melempar exception jika string lebih pendek dari n, jadi kode produksi memeriksa panjangnya:
Output:
**** 1111
An Unexpecte...
Hi
Hi
Jika yang ingin kamu buang adalah bagian awal string, Substring(n) saja sudah cukup: "#FF8800".Substring(1) adalah "FF8800". Method terkait, Remove(start, count), melakukan kebalikan dari Substring: ia mengembalikan string dengan rentang itu dihapus.
Substring dengan IndexOf
Kebanyakan substring di dunia nyata ditemukan, bukan dihitung. IndexOf mengembalikan posisi sebuah karakter atau string (atau -1 jika tidak ada), dan LastIndexOf mencari dari ujung. Gabungkan keduanya dengan Substring untuk memotong teks di sekitar sebuah pemisah:
Output:
maya.lopez
example.com
pdf
report.final.v2
WARN
Disk almost full
Perhitungannya mengikuti satu aturan: untuk mengambil teks di antara posisi a dan b (keduanya tidak termasuk), posisi awalnya a + 1 dan panjangnya b - a - 1.
Bahayanya adalah IndexOf yang mengembalikan -1. email.Substring(0, -1) melempar exception, dan yang lebih buruk, email.Substring(-1 + 1) diam-diam mengembalikan seluruh string. Selalu periksa:
Output:
shop.io
(none)
Split sebagai alternatif
Jika sebuah string adalah daftar field dengan pemisah, Split lebih sederhana daripada rangkaian pemanggilan IndexOf dan Substring, dan tidak ada perhitungan indeks yang bisa salah:
Output:
Ana Silva
Porto
maya.lopez
beach.jpg
Split mengalokasikan sebuah array plus satu string untuk setiap field, jadi untuk satu potongan saja di perulangan yang sering dijalankan, IndexOf dan Substring lebih hemat. Untuk kasus lainnya, keterbacaan lebih penting. Option lainnya (beberapa pemisah, membuang entri kosong, jumlah maksimum) ada di method string. Untuk pola seperti "digit setelah ID:", regular expression biasanya menjadi alat yang paling jelas.
Operator range (C# 8 dan sesudahnya)
C# 8 menambahkan sintaks index dan range, yang bisa dipakai pada string dan array. ^n berarti "n dari ujung", dan a..b adalah rentang dari a sampai sebelum b (ujung akhirnya tidak termasuk), jadi angka keduanya adalah indeks akhir, bukan panjang:
// C# 8 and later
string sku = "SHOE-4271-BLK";
string first4 = sku[..4]; // "SHOE" same as Substring(0, 4)
string middle = sku[5..9]; // "4271" same as Substring(5, 4)
string last3 = sku[^3..]; // "BLK" same as Substring(sku.Length - 3)
string noEnds = sku[1..^1]; // "HOE-4271-BL" drop first and last
char lastChar = sku[^1]; // 'K'
Pada string, range dikompilasi menjadi pemanggilan Substring, jadi ia mengalokasikan string baru dan melempar ArgumentOutOfRangeException untuk kasus di luar batas yang sama. Memilih yang mana hanya soal gaya; range lebih enak dibaca jika kedua ujungnya diukur dari sisi yang berbeda ([1..^1]).
Substring tanpa menyalin: Span
Setiap pemanggilan Substring mengalokasikan string baru. Di kode parsing yang sensitif terhadap performa (membaca file besar, menangani banyak request), .NET Core 2.1 dan sesudahnya menyediakan ReadOnlySpan<char>, sebuah tampilan ke sebagian string asli tanpa penyalinan:
ReadOnlySpan<char> line = "2026-09-24,42.50,EUR".AsSpan();
ReadOnlySpan<char> amount = line.Slice(11, 5); // "42.50", no allocation
decimal value = decimal.Parse(amount, provider: CultureInfo.InvariantCulture);
Span tidak bisa disimpan di field class biasa atau dipakai melewati await, jadi tempatnya di kode sinkron yang ketat. Untuk kode aplikasi pada umumnya, Substring adalah alat yang tepat.
Kesalahan umum
- Memberikan indeks akhir sebagai panjang.
s.Substring(2, 5)berarti lima karakter mulai dari indeks 2, bukan "indeks 2 sampai 5". Untuk mengambil teks dari indeksasampai sebelum indeksb, panjangnya adalahb - a. - Tidak memeriksa -1 dari
IndexOf. Hasilnya bisa exception atau, dengan+ 1, tanpa sengaja seluruh string. - Mengira string pendek cukup panjang. Nama, kode, atau baris dari sebuah file bisa lebih pendek dari yang kamu kira. Batasi dengan
Math.Minatau periksaLength. - Membuang hasilnya.
s.Substring(1);di barisnya sendiri tidak melakukan hal yang berguna.
Pertanyaan yang sering diajukan
Bagaimana cara kerja Substring di C#?
s.Substring(start) mengembalikan karakter dari indeks start sampai akhir; s.Substring(start, length) mengembalikan length karakter mulai dari start. Indeks dimulai dari 0, dan argumen kedua adalah panjang, bukan indeks akhir: "Hello".Substring(1, 3) adalah "ell". String aslinya tidak berubah.
Kenapa Substring melempar ArgumentOutOfRangeException?
Karena start bernilai negatif atau lebih besar dari panjang string, atau start + length melewati akhir string. Penyebab paling umum adalah panjang yang dihitung untuk string yang lebih panjang, atau hasil -1 dari IndexOf yang dipakai sebagai posisi awal. Batasi panjangnya dengan Math.Min(length, s.Length - start) dan periksa hasil IndexOf sebelum memakainya.
Bagaimana cara mengambil n karakter terakhir dari string di C#?
s.Substring(s.Length - n) mengembalikan n karakter terakhir, selama n <= s.Length. Agar aman untuk string pendek, pakai s.Length <= n ? s : s.Substring(s.Length - n). Di C# 8 dan sesudahnya kamu juga bisa menulis s[^n..], yang melempar exception dengan cara yang sama jika n terlalu besar.
Bagaimana cara mengambil substring di antara dua karakter di C#?
Cari kedua posisinya dengan IndexOf, lalu ambil bagian di antaranya: int start = s.IndexOf('(') + 1; int end = s.IndexOf(')', start); string inside = s.Substring(start, end - start);. Pastikan setiap IndexOf menemukan sesuatu (bukan -1) sebelum memanggil Substring. Untuk pola yang rumit, regular expression lebih jelas.
Apakah Substring di C# dimulai dari nol?
Ya. Karakter pertama ada di indeks 0 dan yang terakhir di Length - 1. Substring(0, 3) mengembalikan tiga karakter pertama. Memberikan Length itu sendiri sebagai posisi awal diizinkan dan mengembalikan string kosong.