Sunday, December 25, 2016

Bab 3. Visual C# Untuk Programer



String dan Karakter






3.1 Pengantar

Bab ini mengintroduksi kapabilitas string dan karakter di dalam C#. Teknik yang didiskusikan di sini cocok untuk memvalidasi masukan program, menampilkan informasi kepada pengguna dan manipulasi-manipulasi lain yang berbasis teks.  Teknik-teknik ini sesuai untuk mengembangkan editor teks, perangkat lunak untuk pengolah kata, dan lain-lain. Bab ini akan mendiskusikan lebih detil tentang kapabilitas kelas string dan tipe char dari namespace System dan StringBuilder dari namespace System.Text.

Kelas StringBuilder, yang dipakai untuk membangun string secara dinamis, akan dikupas. Akan didemonstrasikan kapabilitas StringBuilder untuk menetapkan ukuran sebuah StringBuilder, berikut dengan penempelan, penyisipan, penghapusan, dan penggantian karakter-karater di dalam sebuah objek StringBuilder. Kemudian akan diintroduksi metode-metode pengujian-karakter dari struct Char yang memampukan sebuah program dalam menentukan apakah sebuah karakter merupakan suatu dijit, huruf, huruf kecil, huruf besar, tanda baca, atau simbol selain tanda baca. Metode-metode semacam itu berguna untuk memvalidasi karakter individual dalam masukan pengguna. Selain itu, tipe Char menyediakan metode-metode untuk mengkonversi suatu karakter menjadi huruf besar atau huruf kecil.

Akan didiskusikan pula tentang ekspresi reguler. Kelas Regex dan Match disajikan dari namespace System.Text.RegularExpression. Kemudian akan didemonstrasikan bagaimana mencari pola di dalam suatu string, mencocokkan pola, mengganti karakter-karakter di dalam suatu string yang cocok dengan pola tertentu, dan memecah string pada pembatas (delimiter) yang ditetapkan sebagai pola di dalam ekspresi reguler.

3.2 Dasar Karakter dan String
Karakter merupakan blok pembangun yang fundamental di dalam program sumber C#. Setiap program terdiri-dari runtun karakter yang, ketika dikelompokkan, diinterpretasikan oleh kompiler C# sebagai runtun instruksi untuk menyelesaikan tugas yang diberikan. Suatu program dapat memuat literal karakter. Suatu literal karakter merupakan suatu nilai integer yang direpresentasikan sebagai suatu karakter yang diapit dengan tanda kutip tunggal. Sebagai contoh, ‘z’ merepresentasikan nilai integer atas z, dan ‘\n’ merepresentasikan nilai integer atas karakter garis-baru. Nilai atas suatu literal karakter merupakan nilai integer dari karakter di dalam himpunan karakter Unicode.

String merupakan suatu objek dari kelas string. Literal string (disimpan di dalam memori sebagai objek string) ditulis sebagai runtun karakter yang diapit oleh tanda kutip ganda, seperti:

"Robert Tohonan"           (sebuah nama)
"Jl. Medan Km 10,5 No. 27" (sebuah alamat)
"Siantar, Sumetera Utara" (kota dan propinsi)
"(0622) 456789"            (sebuah nomor telepon)

Suatu string dapat ditugaskan kepada suatu referensi string. Deklarasi

string warna = "hitam";

menginisialisasi variabel bertipe string, warna, untuk menunjuk kepada suatu objek string yang memuat string “hitam”.

3.3 Konstruktor string
Kelas string menyediakan delapan konstruktor untuk menginisialisasi string dalam pelbagai cara. Gambar 3.1 mendemonstrasikan tiga di antaranya.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Gambar 3.1: KonstruktorString.cs
// Mendemonstrasikan konstruktor-konstruktor kelas string class.
using System;

class KonstruktorString
{
    public static void Main( string[] args )
    {
// inisialisasi string
char[] arrayKarakter =
    { 'b', 'i', 'r', 't', 'h', ' ', 'd', 'a', 'y' };
string stringAsli = "Selamat Datang ke Pemrograman C#!";
string string1 = stringAsli;
string string2 = new string( arrayKarakter );
string string3 = new string( arrayKarakter, 6, 3 );
string string4 = new string( 'C', 5 );

        Console.WriteLine( "string1 = " + "\"" + string1 + "\"\n" +
            "string2 = " + "\"" + string2 + "\"\n" +
            "string3 = " + "\"" + string3 + "\"\n" +
            "string4 = " + "\"" + string4 + "\"\n" );
    } // akhir Main
} // akhir kelas KonstruktorString

string1 = "Selamat Datang ke Pemrograman C#!"
string2 = "birth day"
string3 = "day"
string4 = "CCCCC"

Baris 10-11 mengalokasikan array char, arrayKarakter, yang memuat sembilan karakter. Baris 12-16 mendeklarasikan string StringAsli, string1, string2, string3, dan string4. Baris 12 menugaskan literal stringSelamat Datang ke Pemrograman C#!” kepada referensi string, stringAsli. Baris 13 menetapkan string1 untuk mereferensi literal string yang sama.

Baris 14 menugaskan string2 kepada sebuah string baru, menggunakan konstruktor string dengan suatu argumen array karakter. String yang baru itu memuat salinan atas karakter-karakter pada array.

Baris 15 menugaskan string3 kepada sebuah string baru, menggunakan konstruktor string yang mengambil sebuah array char dan dua int sebagai argumennya. Argumen kedua menetapkan posisi indeks awal (offset) dari karakter-karakter di dalam array yang akan disalin. Argumen ketiga menetapkan jumlah karakter yang akan disalin terhitung mulai dari posisi awal pada array. String yang baru akan memuat sebuah salinan atas karakter-karakter yang dispesifikasi di dalam array. Jika offset atau jumlah karakter yang akan disalin mengindikasikan bahwa program harus mengakses elemen di luar batas array, maka eksepsi ArgumentOutOfRange akan dilemparkan.

Baris 16 menugaskan string4 kepada sebuahs string baru, menggunakan konstruktor string yang mengambil sebuah karakter dan sebuah int sebagai argumen untuk menetapkan jumlah kemunculan karakter tersebut di dalam string.

3.4 Indekser string, Properti Length, dan Metode CopyTo
Aplikasi pada Gambar 3.2 menyajikan indekser string, yang memfasilitasi penarikan/pembacaan sembarang karakter di dalam string, dan properti Length, yang menghasilkan panjang string. Metode CopyTo menyalin sejumlah karakter tertentu dari string ke dalam sebuah array char.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Gambar 3.2: MetodeString.cs
// Menggunakan indekser, properti Length, dan metode CopyTo
// dari kelas string.
using System;

class MetodeString
{
    public static void Main( string[] args )
    {
        string string1 = "apa kabar";
        char[] arrayKarakter = new char[ 5 ];

        // menampilkan string1
        Console.WriteLine( "string1: \"" + string1 + "\"" );

// menguji properti Length
Console.WriteLine( "Panjang dari string1: " + string1.Length );

        // menjelajah karakter-karakter pada string1 dan membalikkannya
        Console.Write( "String terbalik adalah: " );

        for ( int i = string1.Length - 1; i >= 0; i-- )
            Console.Write( string1[ i ] );

        // menyalin karakter-karakter dari string1 ke arrayKarakter
        string1.CopyTo( 0, arrayKarakter, 0, arrayKarakter.Length );
        Console.Write( "\nArray karakter adalah: " );

        for ( int i = 0; i < arrayKarakter.Length; i++ )
            Console.Write( arrayKarakter[ i ] );

        Console.WriteLine( "\n" );
    } // akhir Main
} // akhir kelas MetodeString

string1: "apa kabar"
Panjang dari string1: 9
String terbalik adalah: rabak apa
Array karakter adalah: apa k

Aplikasi ini menentukan panjang sebuah string, menampilkan karakter-karakternya dalam urutan terbalik, dan menyalin sederet karakter dari string ke sebuah array karakter. Baris 17 menggunakan properti Length untuk menentukan jumlah karakter di dalam string1. Seperti array, string selalu mengetahui ukurannya sendiri.

Baris 22-23 menuliskan karakter-karakter dari string1 dalam urutan terbalik menggunakan indekser string. Indekser string memperlakukan sebuah string sebagai array char dan menghasilkan setiap karakter pada posisi tertentu di dalam string. Indekser menerima sebuah argumen integer sebagai nomor posisi dan menghasilkan karakter pada posisi itu. Seperti array, elemen pertama pada sebuah string dipandang pada posisi 0.

Baris 26 menggunakan metode CopyTo dari kelas string untuk menyalin karakter-karakter dari string1 ke array karakter (arrayKarakter). Argumen pertama yang diberikan pada metode CopyTo merupakan indeks awal penyalinan karakter dilakukan. Argumen kedua adalah array karakter yang merupakan destinasi penyalinan. Argumen ketiga adalah indeks dari lokasi awal tempat penyalinan di dalam array karakter. Argumen terakhir adalah jumlah karakter yang akan disalin dari string. Baris 29-30 menampilkan isi array char satu per satu.




3.5 Membandingkan string
Dua contoh berikutnya akan mendemonstrasikan pelbagai metode untuk membandingkan string. Untuk memahami bagaimana satu string dapat bernilai lebih besar dari atau lebih kecil dari string lainnya, Anda bisa memandangnya sebagai alfabetisasi di dalam kamus.

Membandingkan string dengan Equals, CompareTo, dan Operator Ekualitas (==)
Kelas string menyediakan beberapa cara untuk membandingkan string. Aplikasi pada Gambar 3.3 mendemonstrasikan kegunaan dari metode Equals, CompareTo, dan operator ekualitas (==).

Kondisi pada baris 21 menggunakan metode Equals untuk membandingkan string1 dan literal stringhallo” untuk menentukan apakah keduanya sama. Metode Equals (diwarisi dari kelas object dan didefinisikan-ulang pada kelas string) menguji ekualitas atas dua objek. Metode ini menghasilkan true jika kedua objek sama dan false jika sebaliknya. Pada kasus ini, kondisi menghasilkan true, karena string1 mereferensi objek literal stringhallo”. Metode Equals menggunakan aturan pengurutan kata. Pembandingan “hallo” dengan “HALLO” akan menghasilkan false, karena huruf kecil berbeda dari huruf besar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Gambar 3.3: PerbandinganString.cs
// Membandingkan string
using System;

class PerbandinganString
{
    public static void Main( string[] args )
    {
        string string1 = "hallo";
        string string2 = "selamat jalan";
        string string3 = "Selamat Ultah";
        string string4 = "selamat ultah";

        // menampilkan nilai-nilai dari keempat string
        Console.WriteLine( "string1 = \"" + string1 + "\"" +
            "\nstring2 = \"" + string2 + "\"" +
            "\nstring3 = \"" + string3 + "\"" +
            "\nstring4 = \"" + string4 + "\"\n" );

        // menguji ekualitas menggunakan metode Equals
        if ( string1.Equals( "hallo" ) )
            Console.WriteLine( "string1 sama dengan \"hallo\"" );
        else
            Console.WriteLine( "string1 tidak sama dengan \"hallo\"" );

        // menguji ekualitas dengan ==
        if ( string1 == "hallo" )
            Console.WriteLine( "string1 sama dengan \"hallo\"" );
        else
            Console.WriteLine( "string1 tidak sama dengan \"hallo\"" );

        // menguji ekualitas dengan Equals
        if ( string.Equals( string3, string4 ) ) // metode static
            Console.WriteLine( "string3 sama dengan string4" );
        else
            Console.WriteLine( "string3 tidak sama dengan string4" );

        // menguji CompareTo
        Console.WriteLine( "\nstring1.CompareTo( string2 ) adalah " +
            string1.CompareTo( string2 ) + "\n" +
            "string2.CompareTo( string1 ) adalah " +
            string2.CompareTo( string1 ) + "\n" +
            "string1.CompareTo( string1 ) adalah " +
            string1.CompareTo( string1 ) + "\n" +
            "string3.CompareTo( string4 ) adalah " +
            string3.CompareTo( string4 ) + "\n" +
            "string4.CompareTo( string3 ) adalah " +
            string4.CompareTo( string3 ) + "\n\n" );
    } // akhir Main
} // akhir kelas PerbandinganString

string1 = "hallo"
string2 = "selamat jalan"
string3 = "Selamat Ultah"
string4 = "selamat ultah"

string1 sama dengan "hallo"
string1 sama dengan "hallo"
string3 tidak sama dengan string4

string1.CompareTo( string2 ) adalah -1
string2.CompareTo( string1 ) adalah 1
string1.CompareTo( string1 ) adalah 0
string3.CompareTo( string4 ) adalah 1
string4.CompareTo( string3 ) adalah -1

Kondisi pada baris 27 menggunakan operator ekualitas (==) yang dioverload untuk membandingkan string string1 dengan literal stringhallo”. Dalam C#, operator ekualitas juga membandingkan isi dari dua string. Jadi, kondisi pada statemen if dievaluasi menjadi true, karena isi dari string1 dan “hallo” sama.

Baris 33 menguji apakah string3 dan string4 sama untuk mengilustrasikan bahwa perbandingan bersifat sensitif terhadap huruf. Di sini, metode static Equals dipakai untuk membandingkan nilai dari dua string. “Selamat Ultah” tidak sama dengan “selamat ultah”, jadi kondisi pada statemen if bernilai false, dan pesan “string3 tidak sama dengan string4” ditampilkan (baris 36).

Baris 40-48 menggunakan metode ToString dari kelas string untuk membandingkan string. Metode CompareTo menghasilkan 0 jika kedua string sama, menghasilkan nilai negatif jika string yang memanggil CompareTo bernilai kurang dari string yang dilewatkan sebagai argumen, dan menghasilkan nilai positif jika jika string yang memanggil CompareTo bernilai lebih dari string yang dilewatkan sebagai argumen.

Perhatikan bahwa CompareTo menganggap string3 lebih besar dari string4. Satu-satunya perbedaan dari kedua string adalah bahwa string3 memuat dua huruf besar pada posisi dimana string4 memuat huruf kecil.

Menentukan Apakah string Diawali atau Diakhiri dengan string Tertentu
Gambar 3.4 menunjukkan bagaimana menguji apakah sebuah instans string diawali atau diakhir dengan string tertentu. Metode StartsWith menentukan apakah sebuah instans string diawali dengan teks string yang dilewatkan sebagai argumen. Metode EndsWith menentukan apakah sebuah instans string diakhiri dengan teks string yang dilewatkan sebagai argumen. Metode Main pada kelas StringAwalAkhir mendefinisikan sebuah array string, yang memuat “awal”, “awalan”, “akhir, dan “akhiran”.

Baris 13 menggunakan metode StartsWith, yang mengambil sebuah argumen string. Kondisi pada statemen if menentukan apakah string pada indeks i dari array diawali dengan karakter-karakter “aw”. Jika ya, metode tersebut menghasilkan true, dan string2[i] akan ditampilkan berikut dengan sebuah pesan.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Gambar 3.4: StringAwalAkhir.cs
// Mendemonstrasikan metode StartsWith dan EndsWith.
using System;

class StringAwalAkhir
{
    public static void Main( string[] args )
    {
        string[] string2 = { "awal", "awalan", "akhir", "akhiran" };

        // menguji setiap string untuk memeriksa apakah diawali dengan "aw"
        for ( int i = 0; i < string2.Length; i++ )
            if ( string2[ i ].StartsWith( "aw" ) )
                Console.WriteLine( "\"" + string2[ i ] + "\"" +
                    " diawali dengan \"aw\"" );

        Console.WriteLine();

        // menguji setiap string untuk memeriksa apakah diakhiri dengan "an"
        for ( int i = 0; i < string2.Length; i++ )
            if ( string2[ i ].EndsWith( "an" ) )
                Console.WriteLine( "\"" + string2[ i ] + "\"" +
                    " diakhiri dengan \"an\"" );

        Console.WriteLine();
    } // akhir Main
} // akhir kelas StringAwalAkhir

"awal" diawali dengan "aw"
"awalan" diawali dengan "aw"

"awalan" diakhiri dengan "an"
"akhiran" diakhiri dengan "an"

Baris 21 menggunakan metode EndsWith, yang mengambil sebuah argumen string. Kondisi pada statemen if menentukan apakah string pada indeks i dari array diakhiri dengan karakter-karakter “an”. Jika ya, metode tersebut menghasilkan true, dan string2[i] akan ditampilkan berikut dengan sebuah pesan.

3.6 Mencari Lokasi Karakter dan Substring di dalam string
Pada banyak aplikasi, diperlukan untuk melakukan pencarian terhadap sebuah karakter atau sehimpunan karakter di dalam string. Sebagai contoh, seorang programer yang menciptakan pengolah kata akan menyediakan kapabilitas-kapabilitas pencarian pada dokumen. Aplikasi pada Gambar 3.5 mendemonstrasikan metode IndexOf, IndexOfAny, LastIndexOf, dan LastIndexOfAny, yang melakukan pencarian terhadap karakter tertentu atau terhadap substring di dalam sebuah string. Semua pencarian pada contoh ini dilakukan terhadap string huruf2 (diinisialisasi dengan abcdefghijklmabcdefghijklm") yang berlokasi di dalam Main pada kelas MetodeIndeksString.

Baris 14, 16, dan 18 menggunakan metode IndexOf untuk mencari lokasi kemunculan pertama dari sebuah karakter atau substring di dalam suatu string. Jika ia menemukan sebuah karakter, maka IndexOf akan menghasilkan indeks dari karakter tersebut di dalam string; sebaliknya, IndexOf menghasilkan -1. Ekspresi pada baris 16 menggunakan sebuah versi dari metode IndexOf yang mengambil dua argumen, yaitu karakter yang akan dicari dan indeks awal pencarian. Metode ini tidak memeriksa sembarang karakter yang ada sebelum indeks awal (pada kasus ini, 1). Ekspresi pada baris 18 menggunakan versi lain dari metode IndexOf yang mengambil tiga argumen, yaitu karakter yang akan dicari, indeks awal pencarian, dan jumlah karakter yang akan dipakai untuk melakukan pencarian.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// Gambar 3.5: MetodeIndeksString.cs
// Menggunakan metode-metode pencarian-string.
using System;

class MetodeIndeksString
{
    public static void Main( string[] args )
    {
        string huruf2 = "abcdefghijklmabcdefghijklm";
        char[] huruf2Pencarian = { 'c', 'a', '$' };

        // IndexOf untuk mencari sebuah karakter di dalam suatu string
        Console.WriteLine( "'c' pertama berlokasi pada indeks " +
            huruf2.IndexOf( 'c' ) );
        Console.WriteLine( "'a' pertama mulai dari indeks 1 berlokasi pada indeks " +
            huruf2.IndexOf( 'a', 1 ) );
        Console.WriteLine( "'$' pertama pada 5 posisi mulai dari indeks 3 " +
            "berlokasi pada indeks " + huruf2.IndexOf('$', 3, 5));

        // LastIndexOf untuk mencari sebuah karakter di dalam suatu string
        Console.WriteLine( "\n'c' terakhir berlokasi pada indeks " +
            huruf2.LastIndexOf( 'c' ) );
        Console.WriteLine("'a' terakhir sampai pada indeks 25 berlokasi pada " +
            "indeks " + huruf2.LastIndexOf( 'a', 25 ) );
        Console.WriteLine( "'$' terakhir pada 5 posisi mulai dari indeks 15 " +
            "berlokasi pada indeks " + huruf2.LastIndexOf('$', 15, 5));

        // IndexOf untuk mencari lokasi sebuah substring di dalam suatu a string
        Console.WriteLine( "\n\"def\" pertama berlokasi pada indeks " +
            huruf2.IndexOf( "def" ) );
        Console.WriteLine( "\"def\" pertama mulai dari indeks 7 berlokasi pada " +
            "indeks " + huruf2.IndexOf( "def", 7 ) );
        Console.WriteLine( "\"hello\" pertama pada 15 posisi " +
            "mulai dari indeks 5 berlokasi pada indeks " +
            huruf2.IndexOf( "hello", 5, 15 ) );

        // LastIndexOf untuk mencari lokasi sebuah substring di dalam suatu a string
        Console.WriteLine( "\n\"def\" terakhir berlokasi pada indeks " +
            huruf2.LastIndexOf( "def" ) );
        Console.WriteLine( "\"def\" terakhir sampai posisi 25 berlokasi " +
            "pada indeks " + huruf2.LastIndexOf( "def", 25 ) );
        Console.WriteLine( "\"hello\" pada 15 posisi " +
            "berakhir pada indeks 20  berlokasi pada indeks " +
            huruf2.LastIndexOf( "hello", 20, 15 ) );

        // IndexOfAny untuk mencari kemunculan pertama dari karakter di dalam array
        Console.WriteLine( "\n'c', 'a' atau '$' pertama " +
            "berlokasi pada indeks " + huruf2.IndexOfAny( huruf2Pencarian ) );
        Console.WriteLine("'c', 'a' atau '$' pertama mulai dari indeks 7 " +
            "berlokasi pada indeks " + huruf2.IndexOfAny( huruf2Pencarian, 7 ) );
        Console.WriteLine( "'c', 'a' atau '$' pertama pada 5 posisi " +
            "mulai dari indeks 7 berlokasi pada indeks " +
            huruf2.IndexOfAny( huruf2Pencarian, 7, 5 ) );

        // LastIndexOfAny untuk mencari kemunculan terakhir dari karakter
        // di dalam array
        Console.WriteLine( "\'c', 'a' atau '$' terakhir " +
            "berlokasi pada indeks " + huruf2.LastIndexOfAny( huruf2Pencarian ) );
        Console.WriteLine("'c', 'a' atau '$' terakhir sampai posisi 1 " +
            "berlokasi pada indeks " +
            huruf2.LastIndexOfAny( huruf2Pencarian, 1 ) );
        Console.WriteLine("'c', 'a' atau '$' terakhir pada 5 posisi " +
            "berakhir pada indeks 25 berlokasi pada indeks " +
            huruf2.LastIndexOfAny( huruf2Pencarian, 25, 5 ) );
    } // akhir Main
} // akhir kelas MetodeIndeksString

'c' pertama berlokasi pada indeks 2
'a' pertama mulai dari indeks 1 berlokasi pada indeks 13
'$' pertama pada 5 posisi mulai dari indeks 3 berlokasi pada indeks -1

'c' terakhir berlokasi pada indeks 15
'a' terakhir sampai pada indeks 25 berlokasi pada indeks 13
'$' terakhir pada 5 posisi mulai dari indeks 15 berlokasi pada indeks -1

"def" pertama berlokasi pada indeks 3
"def" pertama mulai dari indeks 7 berlokasi pada indeks 16
"hello" pertama pada 15 posisi mulai dari indeks 5 berlokasi pada indeks -1

"def" terakhir berlokasi pada indeks 16
"def" terakhir sampai posisi 25 berlokasi pada indeks 16
"hello" pada 15 posisi berakhir pada indeks 20  berlokasi pada indeks -1

'c', 'a' atau '$' pertama berlokasi pada indeks 0
'c', 'a' atau '$' pertama mulai dari indeks 7 berlokasi pada indeks 13
'c', 'a' atau '$' pertama pada 5 posisi mulai dari indeks 7 berlokasi pada indeks -1
'c', 'a' atau '$' terakhir berlokasi pada indeks 15
'c', 'a' atau '$' terakhir sampai posisi 1 berlokasi pada indeks 0
'c', 'a' atau '$' terakhir pada 5 posisi berakhir pada indeks 25 berlokasi pada indeks -1

Baris 22, 24, dan 26 menggunakan metode LastIndexOf untuk mencari lokasi kemunculan terakhir atas sebuah karakter di dalam suatu string. Metode LastIndexOf melakukan pencarian dari akhir string sampai awal string. Jika ia menemukan karakter yang dicari, LastIndexOf akan menghasilkan indeks dari karakter itu di dalam string; sebaliknya, LastIndexOf menghasilkan -1. Ekspresi pada baris 22 menggunakan versi LastIndexOf yang mengambil karakter yang akan dicari sebagai argumen. Ekspresi pada baris 24 menggunakan versi LastIndexOf yang mengambil dua argumen, yaitu karakter yang dicari dan indeks tertinggi untuk memulai pencarian mundur. Ekspresi pada baris 26 menggunakan versi ketiga dari metode LastIndexOf yang mengambil tiga argumen, yaitu karakter yang dicari, indeks tertinggi untuk memulai pencarian mundur, dan jumlah karakter (potongan string) yang menjadi lokasi pencarian.

Baris 29-34 menggunakan versi IndexOf dan LastIndexOf yang mengambil sebuah string (menggantikan sebuah karakter) sebagai argumen pertama. Kedua versi ini melakukan pencarian identik seperti yang telah dijelaskan, kecuali bahwa target pencarian adalah runtun karakter (substring) yang ditetapkan sebagai argumen stringnya.

Baris 47-64 menggunakan metode IndexOfAny dan LastIndexOfAny, yang mengambil sebuah array karakter sebagai argumen pertamanya. Kedua metode ini juga melakukan pencarian identik seperti yang telah dijelaskan, kecuali bahwa keduanya menghasilkan indeks dari kemunculan pertama dari sembarang karakter yang ada di dalam argumen array-karakter.

3.7 Mengekstrak Substring dari string
Kelas string menyediakan dua metode Substring, yang menciptakan sebuah string baru dengan menyalin sebagian dari string yang sudah ada. Setiap metode ini menghasilkan sebuah string baru. Aplikasi pada Gambar 3.6 mendemonstrasikan kegunaan dari kedua metode ini.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Gambar 3.6: SubString.cs
// Mendemonstrasikan metode Substring dari kelas string.
using System;

class SubString
{
    public static void Main( string[] args )
    {
        string huruf2 = "abcdefghijklmabcdefghijklm";

        // memanggil metode Substring dan melewatkannya satu parameter
        Console.WriteLine( "Substring dari indeks20 sampai akhir adalah \"" +
            huruf2.Substring( 20 ) + "\"" );

        // memanggil metode Substring dan melewatkannya dua parameter
        Console.WriteLine( "Substring dari indeks 0 dengan panjang 6 adalah \"" +
            huruf2.Substring( 0, 6 ) + "\"" );
    } // akhir metode Main
} // akhir kelas SubString

Substring dari indeks20 sampai akhir adalah "hijklm"
Substring dari indeks 0 dengan panjang 6 adalah "abcdef"

Statemen pada baris 13 menggunakan metode Substring yang mengambil satu argumen int. Argumen itu menetapkan indeks awal, dimana metode menyalin karakter-karakter di dalam string awal. Substring yang dihasilkan memuat salinan karakter-karakter dari indeks awal sampai akhir string. Jika indeks yang ditetapkan pada argumen berada di luar batas string, maka program akan melemparkan eksepsi ArgumentOutOfRangeException.

Versi kedua dari metode Substring (baris 17) mengambil dua argumen int. Argumen pertama menetapkan indeks awal (lokasi awal penyalinan). Argumen kedua menetapkan panjang substring yang akan disalin. Substring yang dihasilkan memuat salinan dari karakter-karakter yang ditetapkan dari string asli. Jika panjang substring yang diminta terlalu besar, maka program akan melemparkan eksepsi ArgumentOutOfRangeException.

3.8 Menyambung string
Operator + bukan satu-satunya cara untuk melakukan penyambungan string. Metode static Concat dari kelas string (Gambar 3.7) menyambung dua string dan menghasilkan sebuah string baru yang memuat karakter-karakter terkombinasi dari kedua string asli. Baris 16 menempelkan karakter-karakter dari string2 di akhir salinan dari string1, menggunakan metode Concat. Statemen pada baris 16 tidak memodifikasi kedua string asli.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Gambar 3.7: SambungString.cs
// Mendemonstrasikan metode Concat dari kelas string.
using System;

class SambungString
{
    public static void Main( string[] args )
    {
        string string1 = "Selamat ";
        string string2 = "Ultah";

        Console.WriteLine( "string1 = \"" + string1 + "\"\n" +
            "string2 = \"" + string2 + "\"" );
        Console.WriteLine(
            "\nHasil dari string.Concat( string1, string2 ) = " +
        string.Concat( string1, string2 ) );
        Console.WriteLine( "string1 setelah penyambungan = " + string1 );
    } // akhir Main
} // akhir kelas SambungString

string1 = "Selamat "
string2 = "Ultah"

Hasil dari string.Concat( string1, string2 ) = Selamat Ultah
string1 setelah penyambungan = Selamat

3.9 Pelbagai Metode string
Kelas string menyediakan beberapa metode yang menghasilkan salinan-salinan termodifikasi dari string. Aplikasi pada Gambar 3.8 mendemonstrasikan kegunaan dari metode-metode ini, mencakup metode-metode Replace, ToLower, ToUpper, dan Trim.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Gambar 3.8: Metode2String.cs
// Mendemonstrasikan metode Replace, ToLower, ToUpper, Trim,
// dan ToString.
using System;

class StringMethods2
{
    public static void Main( string[] args )
    {
        string string1 = "Horas!";
        string string2 = "SELAMAT JALAN ";
        string string3 = " spasi ";

        Console.WriteLine( "string1 = \"" + string1 + "\"\n" +
            "string2 = \"" + string2 + "\"\n" +
            "string3 = \"" + string3 + "\"" );

        // memanggil metode Replace
        Console.WriteLine(
            "\nMengganti \"o\" dengan \"O\" pada string1: \"" +
            string1.Replace( 'o', 'O' ) + "\"" );

        // memanggil ToLower dan ToUpper
        Console.WriteLine( "\nstring1.ToUpper() = \"" +
            string1.ToUpper() + "\"\nstring2.ToLower() = \"" +
            string2.ToLower() + "\"" );

        // memanggil metode Trim
        Console.WriteLine( "\nstring3 setelah Trim = \"" +
            string3.Trim() + "\"" );

        Console.WriteLine( "\nstring1 = \"" + string1 + "\"" );
    } // akhir Main
} // akhir kelas Metode2String

string1 = "Horas!"
string2 = "SELAMAT JALAN "
string3 = " spasi "

Mengganti "o" dengan "O" pada string1: "HOras!"

string1.ToUpper() = "HORAS!"
string2.ToLower() = "selamat jalan "

string3 setelah Trim = "spasi"

string1 = "Horas!"

Baris 21 menggunakan metode Replace untuk menghasilkan sebuah string baru, mengganti setiap kemunculan karakter ‘o’ di dalam string1 dengan ‘O’. Metode Replace mengambil dua argumen, yaitu sebuah char yang akan dicari dan sebuah char lain untuk mengganti setiap kemunculan dari argumen pertama. String asli tidak berubah. Jika tidak ada kemunculan dari argumen pertama di dalam string, maka metode ini menghasilkan string asli. Versi teroverload dari metode ini memampukan Anda untuk menyediakan dua string sebagai argumen.

Metode ToUpper menghasilkan sebuah string baru (baris 25) yang mengganti setiap huruf kecil di dalam string1 dengan huruf besar ekivalen. Metode ini menghasilkan sebuah string baru yang memuat string terkonversi; string asli tetap tidak berubah. Jika tidak ada karakter yang dikonversi, maka string asli menjadi nilai balik. Baris 26 menggunakan metode ToLower untuk menghasilkan sebuah string baru dimana setiap huruf besar pada string2 diganti dengan huruf kecil ekivalen. String asli tidak berubah. Sama seperti ToUpper, jika tidak ada karakter yang dikonversi, maka string asli menjadi nilai balik.

Baris 30 menggunakan metode Trim untuk menghapus semua karakter spasi-putih yang muncul di awal dan di akhir sebuah string. Tanpa mengubah string asli, metode ini menghasilkan sebuah string baru yang memuat string asli (tanpa spasi-putih). Metode ini khususnya berguna untuk membaca masukan pengguna (melalui sebuah TextBox). Versi lain dari metode Trim mengambil sebuah array karakter sebagai argumen dan menghasilkan suatu salinan string yang tidak diawali atau diakhiri dengan setiap karakter yang ada di dalam argumen array.

3.10 Kelas StringBuilder
Kelas string menyediakan banyak kapabilitas untuk pemrosesan string. Namun, isi string asli tidak pernah berubah. Operasi-operasi penyambungan string pada kenyataannya menugaskan referensi-referensi string kepada string yang baru (misalnya, operator += menciptakan sebuah string baru dan menugaskan referensi string awal kepada string yang baru saja diciptakan).

Pada beberapa bagian ke depan mendiskusikan beberapa fitur dari kelas StringBuilder (namespace System.Text), yang dipakai untuk menciptakan dan memanipulasi informasi string dinamis. Setiap StringBuilder dapat menyimpan sejumlah karakter tertentu yang ditetapkan oleh kapasitasnya. Jika terjadi kelebihan kapasitas dari sebuah StringBuilder, maka kapasitasnya akan membengkak untuk mengakomodasi karakter-karakter tambahan. Anggota-anggota dari kelas StringBuilder, seperti metode Append dan AppendFormat, dapat dipakai untuk melakukan operasi penyambungan seperti operator + dan += dari kelas string. Kelas StringBuilder khususnya berguna untuk memanipulasi string yang berukuran besar.

Kelas StringBuilder menyediakan enam konstruktor teroverload. Kelas KonstruktorStringBuilder (Gambar 3.9) mendemonstrasikan tiga di antaranya.

Baris 10 memakai konstruktor StringBuilder tanpa-argumen untuk menciptakan sebuah StringBuilder yang tidak memuat satupun karakter dan dengan kapasitas awal default. Baris 11 menggunakan konstruktor StringBuilder yang mengambil sebuah argumen int untuk menciptakan sebuah StringBuilder yang tidak memuat satupun karakter dan dengan kapasitas awal yang ditetapkan di dalam argumen int (misalnya, 10). Baris 12 menggunakan konstruktor StringBuilder yang mengambil sebuah argumen string untuk menciptakan suatu StringBuilder yang memuat karakter-karakter dari argumen string tersebut. Baris 14-16 secara implisit menggunakan metode ToString dari kelas StringBuilder untuk mendapatkan representasi string atas isi dari StringBuilder.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Gambar 3.9: KonstruktorStringBuilder.cs
// Mendemonstrasikan konstruktor-konstruktor kelas StringBuilder.
using System;
using System.Text;

class KonstruktorStringBuilder
{
    public static void Main( string[] args )
    {
StringBuilder buffer1 = new StringBuilder();
StringBuilder buffer2 = new StringBuilder( 10 );
StringBuilder buffer3 = new StringBuilder( "hallo" );

        Console.WriteLine( "buffer1 = \"" + buffer1 + "\"" );
        Console.WriteLine( "buffer2 = \"" + buffer2 + "\"" );
        Console.WriteLine( "buffer3 = \"" + buffer3 + "\"" );
    } // akhir Main
} // akhir kelas KonstruktorStringBuilder

buffer1 = ""
buffer2 = ""
buffer3 = "hallo"

3.11 Properti Length dan Capacity, Metode EnsureCapacity, dan Indekser dari Kelas StringBuilder
Kelas StringBuilder menyediakan properti Length dan Capacity untuk menghasilkan jumlah karakter yang sedang dimuat di dalam suatu StringBuilder dan jumlah karakter yang dapat disimpan oleh sebuah StringBuilder tanpa perlu mengalokasikan memori tambahan. Kedua properti ini juga dapat menambah atau mengurangi panjang kapasitas dari StringBuilder. Metode EnsureCapacity memampukan Anda untuk mereduksi berapa kali kapasitas StringBuilder dapat ditambah. Metode ini memastikan bahwa kapasitas StringBuilder sedikitnya sebesar nilai yang ditetapkan. Program pada Gambar 3.10 mendemonstrasikan metode dan properti ini.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Gambar 3.10: FiturStringBuilder.cs
// Mendemonstrasikan beberapa fitur dari kelas StringBuilder.
using System;
using System.Text;

class FiturStringBuilder
{
    public static void Main( string[] args )
    {
StringBuilder buffer =
    new StringBuilder( "Hallo, apa kabar?" );

        // menggunakan properti Length dan Capacity
        Console.WriteLine( "buffer = " + buffer +
            "\nPanjang = " + buffer.Length +
            "\nKapasitas = " + buffer.Capacity );

        buffer.EnsureCapacity( 75 ); // memastikan kapasitas sedikitnya 75
        Console.WriteLine( "\nKapasitas baru = " +
            buffer.Capacity );

        // memotong StringBuilder dengan menetapkan properti Length
        buffer.Length = 10;
        Console.Write( "\nPanjang baru = " +
            buffer.Length + "\nbuffer = " );

        // menggunakan indekser StringBuilder
        for ( int i = 0; i < buffer.Length; i++ )
            Console.Write( buffer[ i ] );

        Console.WriteLine( "\n" );
    } // akhir Main
} // akhir kelas FiturStringBuilder

buffer = Hallo, apa kabar?
Panjang = 17
Kapasitas = 17

Kapasitas baru = 75

Panjang baru = 10
buffer = Hallo, apa

Program memuat satu StringBuilder, dinamakan buffer. Baris 10-11 pada program menggunakan konstruktor StringBuilder yang mengambil sebuah argumen string untuk menginstansiasi StringBuilder dan menginisialisasinya dengan nilai “Hallo, apa kabar?”. Baris 14-16 menampilkan isi, panjang, dan kapasitas dari StringBuilder.

Baris 18 mengekspansi kapasitas dari StringBuilder menjadi minimum 75 karakter. Jika karakter-karakter baru ditambahkan pada sebuah StringBuilder sehingga panjangnya melebih kapasitas StringBuilder, maka kapasitas bertambah untuk mengakomodasi karakter-karakter tambahan.

Baris 23 menggunakan properti Length untuk menetapkan panjang dari StringBuilder menjadi 10. Jika panjang yang ditetapkan kurang dari jumlah karakter yang ada di dalam StringBuilder, maka isi dari StringBuilder akan dipotong menjadi panjang yang ditetapkan. Jika panjang yang ditetapkan lebih dari jumlah karakter yang ada di dalam StringBuilder, maka karakter-karakter null akan ditempelkan di belakang StringBuilder sampai jumlah karakter total di dalam StringBuilder sama dengan panjang yang ditetapkan.

3.12 Metode Append dan AppendFormat dari Kelas StringBuilder
Kelas StringBuilder menyediakan 19 metode Append teroverload yang memampukan pelbagai tipe nilai ditambahkan ke akhir sebuah StringBuilder. Pustaka kelas Framework menyediakan beberapa versi untuk tiap tipe sederhana dan untuk array karakter, string dan object. Ingat bahwa metode ToString menghasilkan representasi string atas sembarang object. Setiap metode Append mengambil sebuah argumen, mengkonversinya menjadi sebuah string dan menempelkannya ke StringBuilder. Gambar 3.11 mendemonstrasikan kegunaan dari beberapa metode Append.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// Gambar 3.11: TempelStringBuilder.cs
// Mendemonstrasikan metode-metode Append dari kelas StringBuilder.
using System;
using System.Text;

class StringBuilderAppend
{
    public static void Main( string[] args )
    {
        object nilaiObjek = "hallo";
        string nilaiString = "selamat jalan";
        char[] arrayKarakter = { 'a', 'b', 'c', 'd', 'e', 'f' };
        bool nilaiBoolean = true;
        char nilaiKarakter = 'Z';
        int nilaiInteger = 7;
        long nilaiLong = 1000000;
        float nilaiFloat = 2.5F; // sufiks F mengindikasikan 2.5 adalah float
        double nilaiDouble = 33.333;
        StringBuilder buffer = new StringBuilder();

        // menggunakan metode Append untuk menempelkan nilai-nilai pada buffer
buffer.Append( nilaiObjek );
buffer.Append( " " );
buffer.Append( nilaiString );
buffer.Append( " " );
buffer.Append( arrayKarakter );
buffer.Append( " ");
buffer.Append( arrayKarakter, 0, 3 );
buffer.Append( " " );
buffer.Append( nilaiBoolean );
buffer.Append( " " );
buffer.Append( nilaiKarakter );
buffer.Append( " " );
buffer.Append( nilaiInteger );
buffer.Append( " " );
buffer.Append( nilaiLong );
buffer.Append( " " );
buffer.Append( nilaiFloat );
buffer.Append( " " );
buffer.Append( nilaiDouble );

        Console.WriteLine( "buffer = " + buffer.ToString() + "\n" );
    } // akhir Main
} // akhir kelas TempelStringBuilder

buffer = hallo selamat jalan abcdef abc True Z 7 1000000 2.5 33.333

Baris 22-40 menggunakan 10 metode Append teroverload untuk menempelkan representasi string dari objek-objek yang diciptakan pada baris 10-18 ke akhir StringBuilder.

Kelas StringBuilder juga menyediakan metode AppendFormat, yang mengkonversi sebuah string menjadi format tertentu, kemudian menempelkannya ke StringBuilder. Contoh pada Gambar 3.12 mendemonstrasikan kegunaan dari metode ini.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Gambar 3.12: AppendFormatStringBuilder.cs
// Mendemonstrasikan metode AppendFormat.
using System;
using System.Text;

class AppendFormatStringBuilder
{
    public static void Main( string[] args )
    {
        StringBuilder buffer = new StringBuilder();

// string terformat
string string1 = "{0} ini seharga: {1:C}.\n";

// array argumen string1
object[] arrayObjek = new object[ 2 ];

arrayObjek[ 0 ] = "Mobil";
arrayObjek[ 1 ] = 1234.56;

        // menempelkan string terformat pada buffer
        buffer.AppendFormat( string1, arrayObjek );

        // string terformat
string string2 = "Angka:{0:d3}.\n" +
    "Angka disejajarkan ke kanan dengan spasi:{0, 4}.\n" +
    "Angka disejajarkan ke kiri dengan spasi:{0, -4}.";

        // menempelkan string terformat pada buffer
        buffer.AppendFormat( string2, 5 );

        // menampilkan string-string terformat
        Console.WriteLine( buffer.ToString() );
    } // akhir Main
} // akhir kelas AppendFormatStringBuilder

obil ini seharga: $1,234.56.
ngka:005.
ngka disejajarkan ke kanan dengan spasi:   5.
ngka disejajarkan ke kiri dengan spasi:5   .

Baris 13 menciptakan sebuah string yang memuat informasi pemformatan. Informasi yang diapit oleh sepasang kurung kurawal ini menetapkan bagaimana memformat potongan data tertentu. Format tersebut berupa {X[,Y][:FormatString]}, dimana X adalah jumlah argumen yang akan diformat, mulai dari nol. Y adalah argumen opsional, yang dapat bernilai positif atau negatif, mengindikasikan berapa banyak karakter yang ada pada hasil. Jika string yang dihasilkan kurang dari jumlah Y, maka ia akan diganjal dengan spasi-spasi. Integer positif akan menyejajarkan string ke kanan; Integer negatif akan menyejajarkan string ke kiri. FormatString opsional menggunakan format tertentu terhadap argumen, yaitu currency, desimal, atau saintifik. Pada kasus ini, “{0}” berarti argumen pertama akan ditampilkan. “{1:C}” menetapkan bahwa argumen kedua akan diformat sebagai nilai moneter (currency).

Baris 22 menunjukkan sebuah versi dari AppendFormat yang mengambil dua parameter, yaitu sebuah string yang menetapkan format dan sebuah array objek yang berperan sebagai argumen-argumen bagi string format. Argumen yang ditunjuk oleh “{0}” adalah array objek pada indeks 0.

Baris 25-27 mendefinisikan string lain yang dipakai untuk pemformatan. Format pertama, “{0:d3}”, menetapkan bahwa argumen pertama akan diformat sebagai sebuah desimal tiga-dijit, yang berarti bahwa sembarang angka yang kurang dari tiga dijit akan memiliki nol-nol yang berada di depan angka tersebut. Format berikutnya, “{0, 4}”, menetapkan bahwa string terformat harus memiliki empat karakter dan disejajarkan ke kanan. Format ketiga, “{0, -4}”, menetapkan bahwa string terformat harus disejajarkan ke kiri.

Baris 30 menggunakan sebuah versi dari AppendFormat yang mengambil dua parameter, yaitu sebuah string yang memuat sebuah format dan sebuah objek (dimana format akan diterapkan pada objek itu). Pada kasus ini, objek adalah angka 5. Keluaran pada Gambar 3.12 menampilkan hasil dari penerapan kedua versi dari AppendFormat.

3.13 Metode Insert, Remove, dan Replace dari Kelas StringBuilder
Kelas StringBuilder menyediakan 18 metode Insert teroverload yang memampukan pelbagai tipe data untuk disisipkan pada sembarang posisi di dalam sebuah StringBuilder. Kelas ini menyediakan beberapa versi untuk tiap tipe sederhanan dan untuk array karakter, string dan object. Setiap metode mengambil argumen keduanya, mengkonversinya menjadi sebuah string, dan menyisipkan string itu ke dalam StringBuilder di depan karakter pada posisi yang ditetapkan oleh argumen pertama. Indeks yang ditetapkan oleh argumen pertama harus lebih besar atau sama dengan 0 dan kurang dari panjang StringBuilder; sebaliknya, program akan melemparkan eksepsi ArgumentOutOfRangeException.

Kelas StringBuilder juga menyediakan metode Remove untuk menghapus sebagian dari sebuah StringBuilder. Metode Remove mengambil dua argumen, yaitu indeks untuk memulai penghapusan dan jumlah karakter yang akan dihapus. Penjumlahan atas indeks awal dan jumlah karakter yang akan dihapus harus bernilai kurang dari panjang StringBuilder; sebaliknya, program akan melemparkan eksepsi ArgumentOutOfRangeException. Metode Insert dan Remove didemonstrasikan pada Gambar 3.13.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Gambar 3.13: SisipHapusStringBuilder.cs
// Mendemonstrasikan metode Insert dan Remove dari
// kelas StringBuilder.
using System;
using System.Text;

class SisipHapusStringBuilder
{
    public static void Main( string[] args )
    {
        object nilaiObjek = "hallo";
        string nilaiString = "selamat jalan";
        char[] arrayKarakter = { 'a', 'b', 'c', 'd', 'e', 'f' };
        bool nilaiBoolean = true;
        char nilaiKarakter = 'K';
        int nilaiInteger = 7;
        long nilaiLong = 10000000;
        float nilaiFloat = 2.5F; // sufiks F mengindikasikan 2.5 adalah float
        double nilaiDouble = 33.333;
        StringBuilder buffer = new StringBuilder();

        // menyisipkan nilai-nilai ke dalam buffer
buffer.Insert( 0, nilaiObjek );
buffer.Insert( 0, " " );
buffer.Insert( 0, nilaiString );
buffer.Insert( 0, " " );
buffer.Insert( 0, arrayKarakter );
buffer.Insert( 0, " " );
buffer.Insert( 0, nilaiBoolean );
buffer.Insert( 0, " " );
buffer.Insert( 0, nilaiKarakter );
buffer.Insert( 0, " " );
buffer.Insert( 0, nilaiInteger );
buffer.Insert( 0, " " );
buffer.Insert( 0, nilaiLong );
buffer.Insert( 0, " " );
buffer.Insert( 0, nilaiFloat );
buffer.Insert( 0, " " );
buffer.Insert( 0, nilaiDouble );
buffer.Insert( 0, " " );

        Console.WriteLine( "buffer setelah beberapa kali Insert: \n" + buffer + "\n" );

buffer.Remove( 10, 1 ); // menghapus 2 pada 2.5
buffer.Remove(4, 4); // menghapus .333 pada 33.333

        Console.WriteLine( "buffer setelah beberapa kali Remove:\n" + buffer );
    } // akhir Main
} // akhir kelas SisipHapusStringBuilder

buffer setelah beberapa kali Insert:
 33.333 2.5 10000000 7 K True abcdef selamat jalan hallo

buffer setelah beberapa kali Remove:
 33.2. 10000000 7 K True abcdef selamat jalan hallo

Berikut adalah metode Replace dari kelas StringBuilder yang melakukan pencarian terhadap string atau karakter tertentu dan menggantinya dengan string atau karakter lain. Gambar 3.14 mendemonstrasikan metode ini.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Gambar 3.14: GantiStringBuilder.cs
// Mendemonstrasikan metode Replace.
using System;
using System.Text;

class GantiStringBuilder
{
    public static void Main( string[] args )
    {
        StringBuilder builder1 =
            new StringBuilder( "Selamat Ultah Vivian" );
        StringBuilder builder2 =
            new StringBuilder( "selamat jalan sihol" );

        Console.WriteLine( "Sebelum penggantian:\n" +
            builder1.ToString() + "\n" + builder2.ToString() );

builder1.Replace( "Vivian", "Sihol" );
builder2.Replace( 's', 'S', 0, 5 );

        Console.WriteLine( "\nSetelah penggantian:\n" +
            builder1.ToString() + "\n" + builder2.ToString() );
    } // akhir Main
} // akhir kelas GantiStringBuilder

Sebelum penggantian:
Selamat Ultah Vivian
selamat jalan sihol

Setelah penggantian:
Selamat Ultah Sihol
Selamat jalan sihol

Baris 18 menggunakan metode Replace untuk mengganti semua instans “Vivian” dengan “Sihol” pada builder1. Versi teroverload lain dari metode ini mengambil dua karakter sebagai parameter dan mengganti setiap kemunculan karakter pertama dengan karakter kedua. Baris 19 menggunakan versi teroverload dari Replace yang mengambil empat parameter, yaitu dua parameter pertama adalah karakter dan dua parameter kedua adalah int. Metode ini mengganti semua instans dari karakter pertama dengan karakter kedua, diawali pada indeks yang ditetapkan oleh argumen int pertama sampai sejumlah karakter yang ditetapkan oleh argumen int kedua. Jadi, pada kasus ini, Replace hanya mengganti lima karakter, diawali dari karakter pada indeks 0. Seperti yang diilustrasikan pada keluaran, versi Replace ini mengganti s dengan S pada kata “selamat”, tetapi tidak pada kata “sihol”.

3.14 Metode-Metode dari Kelas Char
C# menyediakan sebuah konsep yang dinamakan struct (singkatan dari structure) yang sama dengan sebuah kelas. Seperti kelas, struct dapat memiliki metode dan properti, dan dapat menggunakan pemodifikasi akses public dan private. Selain itu, anggota-anggota struct dapat diakses melalui operator akses anggota (.).

Tipe-tipe sederhana sebenarnya merupakan alias bagi tipe struct. Sebagai contoh, int didefinisikan oleh struct System.Int32, long didefinisikan oleh System.Int64, dan seterusnya. Semua tipe struct diderivasi dari kelas ValueType, yang diderivasi dari object. Selain itu, semua tipe struct secara implisit adalah sealed, jadi ia tidak mendukung metode virtual atau abstract, dan anggota-anggotanya tidak dapat dideklarasikan protected atau protected internal.

Pada struct Char, 2, yang merupakan struct untuk karakter, hampir semua metode adalah metode static, yang mengambil sedikitnya satu argumen karakter dan melakukan pengujian atau pemanipulasian pada karakter. Gambar 3.15 mendemonstrasikan metode-metode static yang menguji karakter-karakter untuk menentukan apakah ia merupakan bertipe karakter spesifik dan metode-metode static yang melakukan konversi huruf pada karakter-karakter.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Gambar 3.15: Metode2StaticChar.cs
// Mendemonstrasikan metode-metode penguji-karakter dan konversi-huruf
// dari Char struct
using System;

class Metode2StaticChar
{
    static void Main( string[] args )
    {
        Console.Write( "Masukkan sebuah karakter: " );
        char karakter = Convert.ToChar( Console.ReadLine() );

        Console.WriteLine( "apakah dijit: {0}", Char.IsDigit( karakter ) );
        Console.WriteLine( "apakah huruf: {0}", Char.IsLetter( karakter ) );
        Console.WriteLine( "apakah dijit atau huruf: {0}",
            Char.IsLetterOrDigit( karakter ) );
        Console.WriteLine( "apa huruf kecil: {0}",
            Char.IsLower( karakter ) );
        Console.WriteLine( "apa huruf besar: {0}",
            Char.IsUpper( karakter ) );
        Console.WriteLine( "menjadi huruf besar: {0}",
            Char.ToUpper( karakter ) );
        Console.WriteLine( "menjadi huruf kecil: {0}",
            Char.ToLower( karakter ) );
        Console.WriteLine( "apakah tanda baca: {0}",
            Char.IsPunctuation( karakter ) );
        Console.WriteLine( "apakah simbol: {0}", Char.IsSymbol( karakter ) );
    } // akhir Main
} // akhir kelas Metode2StaticChar

Masukkan sebuah karakter: A
apakah dijit: False
apakah huruf: True
apakah dijit atau huruf: True
apa huruf kecil: False
apa huruf besar: True
menjadi huruf besar: A
menjadi huruf kecil: a
apakah tanda baca: False
apakah simbol: False

Masukkan sebuah karakter: 8
apakah dijit: True
apakah huruf: False
apakah dijit atau huruf: True
apa huruf kecil: False
apa huruf besar: False
menjadi huruf besar: 8
menjadi huruf kecil: 8
apakah tanda baca: False
apakah simbol: False

Masukkan sebuah karakter: @
apakah dijit: False
apakah huruf: False
apakah dijit atau huruf: False
apa huruf kecil: False
apa huruf besar: False
menjadi huruf besar: @
menjadi huruf kecil: @
apakah tanda baca: True
apakah simbol: False

Masukkan sebuah karakter: m
apakah dijit: False
apakah huruf: True
apakah dijit atau huruf: True
apa huruf kecil: True
apa huruf besar: False
menjadi huruf besar: M
menjadi huruf kecil: m
apakah tanda baca: False
apakah simbol: False

Masukkan sebuah karakter: +
apakah dijit: False
apakah huruf: False
apakah dijit atau huruf: False
apa huruf kecil: False
apa huruf besar: False
menjadi huruf besar: +
menjadi huruf kecil: +
apakah tanda baca: False
apakah simbol: True

Setelah pengguna memasukkan sebuah karakter, baris 13-27 menganalisanya. Baris 13 menggunakan metode IsDigit dari kelas Char untuk menentukan apakah karakter didefinisikan sebagai sebuah dijit. Jika ya, metode ini menghasilkan true; sebaliknya, ia menghasilkan false. Baris 14 menggunakan metode IsLetter untuk menentukan apakah karakter adalah sebuah huruf. Baris 16 menggunakan metode IsLetterDigit untuk menentukan apakah karakter adalah sebuah huruf atau sebuah dijit.

Baris 18 menggunakan metode IsLower untuk menentukan apakah karakter adalah huruf kecil. Baris 20 menggunakan metode IsUpper untuk menentukan apakah karakter adalah huruf besar. Baris 22 menggunakan metode ToUpper untuk mengkonversi karakter menjadi huruf besar ekivelennya. Metode ini menghasilkan karakter terkonversi jika karakter memiliki huruf besar ekivalennya; sebaliknya, metode ini menghasilkan argumen aslinya. Baris 24 menggunakan metode ToLower untuk mengkonversi karakter menjadi huruf kecil ekivelennya. Metode ini menghasilkan karakter terkonversi jika karakter memiliki huruf kecil ekivalennya; sebaliknya, metode ini menghasilkan argumen aslinya.

Baris 26 menggunakan metode IsPunctuation untuk menentukan apakah karakter merupakan tanda baca, seperti “!”, “:”, atau “)”. Baris 27 menggunakan metode IsSymbol untuk menentukan apakah karakter adalah sebuah simbol, seperti “+”, “=”, atau “^”.

3.15 Ekspresi Reguler
Sekarang akan diintroduksi ekspresi reguler, yang merupakan string terformat yang dipakai untuk mencari pola di dalam teks. Ekspresi reguler ini dipakai untuk memastikan bahwa data dalam format khusus. Kompiler menggunakan ekspresi reguler untuk memvalidasi sintaks program. Jika kode program tidak cocok dengan ekspresi reguler, maka kompiler akan mengindikasikan bahwa terjadi error sintaks. Akan didiskusikan kelas Regex dan Match dari namespace System.Text.RegularExpressions berikut dengan simbol-simbol yang dipakai untuk membentuk ekspresi-ekspresi reguler. Kemudian akan didemonstrasikan bagaimana menemukan pola-pola di dalam sebuah string, mencocokkan keseluruhan string dengan pola-pola, mengganti karakter-karakter di dalam suatu string yang cocok dengan pola tertentu, dan memecah string-string pada pembatas (delimiter) yang ditetapkan sebagai pola pada ekspresi reguler.

Ekspresi Reguler Sederhana dan Kelas Regex
Pustaka kelas .NET Framework menyediakan beberapa kelas untuk membantu para pengembang dalam memanipulasi ekspresi-ekspresi reguler. Gambar 3.16 mendemonstrasikan kelas-kelas ekspresi-reguler dasar. Untuk menggunakan kelas-kelas ini, Anda perlu menambahkan sebuah statemen using untuk namespace System.Text.RegularExpressions (baris 4). Kelas Regex merepresentasikan sebuah ekspresi reguler. Anda menciptakan sebuah objek Regex, dinamai ekspresi (baris 16), untuk merepresentasikan ekspresi reguker “e”. Ekspresi reguler ini mencocokkan karakter literal “e” di dalam sembarang string. Metode Match dari kelas Regex menghasilkan sebuah objek dari kelas Match yang merepresentasikan sebuah kecocokan ekspresi-reguler. Metode ToString dari kelas Match menghasilkan substring yang cocok dengan ekspresi reguler. Pemanggilan terhadap metode Match (baris 17) mencocokkan kemunculan paling-kiri dari karakter “e” pada stringUji. Kelas Regex juga menyediakan metode Matches (baris 21), yang menemukan semua kecocokan dari ekspresi reguler di dalam sembarang string dan menghasilkan sebuah objek MatchCollection yang memuat semua Match. MatchCollection merupakan sebuah koleksi, sama seperti array, dan dapat dipakai dengan statemen foreach untuk beriterasi menjelajah elemen-elemen koleksi. Anda menggunakan sebuah statemen foreach (baris 21-22) untuk menampilkan semua kecocokan ekspresi pada stringUji. Elemen-elemen pada MatchCollection merupakan objek-objek Match, jadi statemen foreach menyimpulkan bahwa variabel kecocokanKu adalah bertipe Match. Untuk tiap Match, baris 22 menampilkan teks yang cocok dengan ekspresi reguler.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Gambar 3.16: RegexDasar.cs
// Mendemonstrasikan ekspresi-ekspresi reguler dasar.
using System;
using System.Text.RegularExpressions;

class RegexDasar
{
    static void Main( string[] args )
    {
        string stringUji =
            "ekspresi-ekspresi reguler kadangkala dinamakan dengan regex atau regexp";
        Console.WriteLine( "String uji adalah\n \"{0}\"", stringUji );
        Console.Write( "Mencocokkan 'e' di dalam string uji: " );

        // mencocokkan 'e' di dalam string uji
        Regex ekspresi = new Regex( "e" );
        Console.WriteLine( ekspresi.Match( stringUji ) );
        Console.Write( "Mencocokkan setiap 'e' di dalam string uji: " );

        // mencocokkan 'e' beberapa kali di dalam string uji
        foreach ( var kecocokanKu in ekspresi.Matches( stringUji ) )
            Console.Write( "{0} ", kecocokanKu );

        Console.Write( "\nMencocokkan \"regex\" di dalam string uji: " );

        // mencocokkan 'regex' di dalam string uji
        foreach (var kecocokanKu in Regex.Matches(stringUji, "regex"))
            Console.Write("{0} ", kecocokanKu);

        Console.Write(
            "\nMencocokkan \"regex\" atau \"regexp\" menggunakan opsi 'p': " );

        // menggunakan pengkuantifikasi ? untuk mencantumkan opsi 'p'
        foreach (var kecocokanKu in Regex.Matches(stringUji, "regexp?"))
            Console.Write("{0} ", kecocokanKu);

        // menggunakan alternasi untuk mencocokkan 'cat' atau 'hat'
        ekspresi = new Regex( "(c|h)at" );
        Console.WriteLine(
            "\n\"hat cat\" cocok dengan {0}, tetapi \"cat hat\" cocok dengan {1}",
            ekspresi.Match( "hat cat" ), ekspresi.Match( "cat hat" ) );
    } // akhir Main
} // akhir kelas RegexDasar

String uji adalah
 "ekspresi-ekspresi reguler kadangkala dinamakan dengan regex atau regexp"
Mencocokkan 'e' di dalam string uji: e
Mencocokkan setiap 'e' di dalam string uji: e e e e e e e e e e e
Mencocokkan "regex" di dalam string uji: regex regex
Mencocokkan "regex" atau "regexp" menggunakan opsi 'p': regex regexp
"hat cat" cocok dengan hat, tetapi "cat hat" cocok dengan cat

Ekspresi-ekspresi reguler dapat pula dipakai untuk mencocokkan suatu runtun karakter literal di dalam sebuah string. Baris 27-28 menampilkan semua kemunculan dari runtun karakter “regex” di dalam stringUji. Di sini, Anda menggunakan metode Matches dari kelas Regex. Kelas Regex menyediakan beberapa versi static dari metode Match dan Matches. Versi-versi static tersebut mengambil sebuah ekspresi reguler dan sebuah string untuk pencarian sebagai argumen. Hal ini berguna ketika Anda ingin memakai ekspresi reguler hanya sekali. Pemanggilan terhadap metode Matches (baris 27) menghasilkan dua kecocokan dengan ekspresi reguler “regex”. Perhatikan bahwa “regexp” di dalam stringUji cocok dengan ekspresi reguler “regex”. Anda menggunakan ekspresi reguler “regexp?” (baris 34) untuk mencocokkan kemunculan dari “regex” dan “regexp”. Tanda tanya (?) merupakan sebuah karakter-met (metacharacter), yaitu sebuah karakter dengan makna spesial di dalam ekspresi reguler. Tanda baca merupakan suatu pengkuantifikasi, yang menjelaskan berapa kali bagian dari suatu pola muncul di dalam suatu kecocokan. Pengkuantifikasi ? mencocokkan nol atau satu kemunculan pola di sebelah kirinya. Pada baris 34, Anda menerapkan pengkuantifikasi ? terhadap karakter “p”. Ini berarti bahwa sebuah kecocokan dengan ekspresi reguler memuat runtun karakter “regex” dan bisa saja diikuti dengan sebuah “p”. Perhatikan bahwa statemen foreach (baris 34-35) menampilkan kedua “regex” dan “regexp”.

Metacharacter memampukan Anda untuk menciptakan pola-pola yang lebih kompleks. Anda menggunakan alternasi (“|”) pada ekspresi reguler “(c|h)at” (baris 38) untuk mencocokkan “cat” atau “hat”. Sepasang kurung dipakai untuk mengelompokkan bagian-bagian dari suatu ekspresi reguler. Metacharacter|” menyebabkan pola untuk mencocokkan runtun karakter yang diawali dengan “c” atau “h”, yang diikuti dengan “at”. Baris 41 menggunakan ekspresi reguler (baris 38) untuk melakukan pencarian terhadap string “hat cat” dan “cat hat”. Perhatikan pada keluaran bahwa kecocokan pertama pada “hat cat” adalah “hat”, sedangkan kecocokan pertama pada “cat hat” adalah “cat”.

Tabel pada Gambar 3.17 mencantumkan beberapa kelas karakter yang dapat dipakai dengan ekspresi reguler. Sebuah kelas karakter merepresentasikan sekelompok karakter yang muncul di dalam sebuah string. Sebagai contoh, karakter kata (\w) merupakan sembarang karakter alfanumerik (a-z, A-Z, dan 0-9) atau garis-bawah (underscore). Karakter garis-putih (\s) merupakan sebuah karakter spasi, tab, carriage return, newline, atau form feed. Dijit (\d) merupakan sembarang karakter numerik.

Kelas  karakter
Mencocokkan
Kelas Karakter
Mencocokkan
\d
sembarang dijit

\D
sembarang tak-dijit
\w
sembarang karakter kata

\W
sembarang karakter tak-kata
\s
sembarang spasi-putih

\S
sembarang tak-spasi-putih

Gambar 3.17 Kelas-kelas karakter

Gambar 3.18 menggunakan kelas-kelas karakter pada ekspresi-ekspresi reguler. Untuk contoh ini, Anda menggunakan metode TampilKecocokan (baris 53-59) untuk menampilkan semua kecocokan dengan sebuah ekspresi reguler. Metode TampilKecocokan mengambil dua string yang merepresentasikan string yang akan dicari dan eksrepsi reguler yang akan dicocokkan. Metode ini menggunakan sebuah statemen foreach untuk menampilkan setiap Match di dalam objek MatchCollection yang dihasilkan oleh metode static Matches dari kelas Regex.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Gambar 3.18: KelasKarakter.cs
// Mendemonstrasikan penggunaan kelas-kelas karakter.
using System;
using System.Text.RegularExpressions;

class KelasKarakter
{
    static void Main( string[] args )
    {
        string stringUji = "abc, DEF, 123";
        Console.WriteLine( "String uji adalah: \"{0}\"", stringUji );

        // menemukan dijit-dijit di dalam string uji
        Console.WriteLine( "Mencocokkan sembarang dijit" );
        TampilKecocokan( stringUji, @"\d" );

        // mencari semua yang bukan dijit
        Console.WriteLine( "\nMencocokkan sembarang tak-dijit" );
        TampilKecocokan( stringUji, @"\D");

        // mencari karakter-karakter kata yang ada di dalam string uji
        Console.WriteLine( "\nMencocokkan sembarang karakter kata" );
        TampilKecocokan( stringUji, @"\w" );

        // mencari runtun yang memuat karakter-karakter kata
        Console.WriteLine(
            "\nMencocokkan sekelompok karakter, memuat sedikitnya satu karakter kata" );
            TampilKecocokan( stringUji, @"\w+" );

        // menggunakan pengkuantifikasi lazy
        Console.WriteLine(
            "\nMencocokkan sekelompok karakter, sedikitnya satu karakter kata (lazy)" );
            TampilKecocokan( stringUji, @"\w+?" );

        // mencocokkan karakter-karakter dari 'a' sampai 'f'
        Console.WriteLine( "\nMencocokkan semuanya dari 'a' - 'f'" );
        TampilKecocokan( stringUji, "[a-f]" );

        // mencocokkan semuanya yang bukan dalam rentang 'a' sampai 'f'
        Console.WriteLine( "\nMencocokkan semuanya yang tidak dari 'a' - 'f'" );
        TampilKecocokan( stringUji, "[^a-f]" );

        // mencocokkan sembarang runtun huruf
        Console.WriteLine( "\nMencocokkan sekelompok karakter, sedikitnya satu huruf" );
        TampilKecocokan( stringUji, "[a-zA-Z]+" );

        // menggunakan metacharacter . (dot) untuk mencocokkan sembarang karakter
        Console.WriteLine( "\nMencocokkan sekelompok karakter" );
        TampilKecocokan( stringUji, ".*" );
    } // akhir Main

    // menampilkan kecocokan-kecocokan dengan ekspresi reguler
    private static void TampilKecocokan( string masukan, string ekspresi )
    {
        foreach ( var kecocokanRegex in Regex.Matches( masukan, ekspresi ) )
            Console.Write( "{0} ", kecocokanRegex );

        Console.WriteLine(); // move to the next line
    } // akhir metode TampilKecocokan
} // akhir kelas KelasKarakter

String uji adalah: "abc, DEF, 123"
Mencocokkan sembarang dijit
1 2 3

Mencocokkan sembarang tak-dijit
a b c ,   D E F ,

Mencocokkan sembarang karakter kata
a b c D E F 1 2 3

Mencocokkan sekelompok karakter yang memuat sedikitnya satu karakter kata
abc DEF 123

Mencocokkan sekelompok karakter yang memuat sedikitnya satu karakter kata (lazy)
a b c D E F 1 2 3

Mencocokkan semuanya dari 'a' - 'f'
a b c

Mencocokkan semuanya yang tidak dari 'a' - 'f'
,   D E F ,   1 2 3

Mencocokkan sekelompok karakter yang memuat sedikitnya satu huruf
abc DEF

Mencocokkan sekelompok karakter
abc, DEF, 123

Ekspresi Reguler Kompleks
Program pada Gambar 3.19 mencoba untuk mencocokkan tanggal lahir dengan sebuah ekspresi reguler. Untuk mendemonstrasikannya, ekspresi akan dicocokkan hanya dengan tanggal lahir yang bukan pada April dan untuk mereka yang memiliki nama dimulai dengan “J”. Anda dapat melakukannya dengan menggabungkan teknik ekspresi-reguler dasar yang telah didiskusikan.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Gambar 3.19: PencocokanRegex.cs
// Ekspresi reguler yang lebih kompleks.
using System;
using System.Text.RegularExpressions;

class PencocokanRegex
{
    static void Main( string[] args )
    {
        // menciptakan suatu ekspresi reguler
        Regex ekspresi = new Regex( @"J.*\d[\d-[4]]-\d\d-\d\d" );

        string stringUji =
            "Jenny lahir pada 05-12-75\n" +
            "David lahir pada 11-04-68\n" +
            "Johan lahir pada 04-28-73\n" +
            "Joni lahir pada 12-17-77";

        // menampilkan semua kecocokan dengan ekspresi reguler
        foreach ( var kecocokanRegex in ekspresi.Matches( stringUji ) )
            Console.WriteLine( kecocokanRegex );
    } // akhir Main
} // akhir kelas PencocokanRegex

Jenny lahir pada 05-12-75
Joni lahir pada 12-17-77

Baris 11 menciptakan sebuah objek Regex dan melewatkan suatu string pola ekspresi-reguler kepada konstruktornya. Karakter pertama pada ekspresi reguler, “J”, merupakan suatu karakter literal. Sembarang string yang memiliki kecocokan dengan ekspresi reguler ini harus diawali dengan “J”. Bagian berikutnya dari ekspresi reguler (“.*”) mencocokkan sejumlah karakter (yang tidak ditentukan) kecuali newline (garis-baru). Pola “J.*” mencocokkan nama orang yang diawali dengan J dan sembarang karakter setelahnya.

Selanjutnya Anda mencocokkan tanggal lahir orang. Anda menggunakan kelas karakter \d untuk mencocokkan dijit pertama dari bulan. Karena tanggal lahir tidak terjadi pada April, dijit kedua pada bulah tidak boleh 4. Anda menggunakan kelas karakter “[0-35-9]” untuk mencocokkan sembarang dijit selain 4. Namun, ekspresi reguler .NET memampukan Anda untuk mengurangkan anggota-anggota dari kelas karakter. Pada baris 11, Anda menggunakan pola “[\d-[4]]” untuk mencocokkan sembarang dijit selain 4.

Baris 20-21 menggunakan sebuah statemen foreach untuk menjelajahi objek MatchCollection yang dihasilkan oleh metode Matches, yang diterima stringUji sebagai argumennya. Untuk tiap Match, baris 21 menampilkan teks yang cocok dengan ekspresi reguler. Keluaran pada Gambar 3.19 menampilkan dua kecocokan yang ditemukan di dalam stringUji. Perhatikan bahwa kedua kecocokan sesuai dengan pola yang ditetapkan oleh ekspresi reguler.

3.16 Memvalidasi Masukan Pengguna dengan Ekspresi Reguler dan LINQ
Aplikasi pada Gambar 3.20 menyajikan sebuah contoh yang melibatkan ekspresi reguler dalam memvalidasi informasi nama, alamat, nomor telepon yang dientrikan oleh pengguna.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Gambar 3.20: Validasi.cs
// Memvalidasi informasi pengguna menggunakan ekspresi reguler.
using System;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace Validasi
{
    public partial class Validasi : Form
    {
        public Validasi()
        {
            InitializeComponent();
        }

        //menangani event Click pada tombol OK
        private void tombolOK_Click(object sender, EventArgs e)
        {
            // menemukan TextBoxes kosong dan diurutkan dengan TabIndex
            var kotakKosong =
            from Control kendaliSekarang in Controls
            where kendaliSekarang is TextBox
            let kotak = kendaliSekarang as TextBox
            where string.IsNullOrEmpty( kotak.Text )
            orderby kotak.TabIndex
            select kotak;

            // jika ada TextBox yang kosong
            if ( kotakKosong.Count() > 0 )
            {
                // display message box indicating missing information
                MessageBox.Show( "Silahkan isi semua bidang",
                    "Informasi Hilang", MessageBoxButtons.OK,
                    MessageBoxIcon.Error );

                kotakKosong.First().Select(); // memilih TextBox kosong pertama
            } // akhir if
            else
            {
                // memeriksa masukan tak-valid
if ( !ValidasiMasukan( namaAkhirTextBox.Text,
    "^[A-Z][a-zA-Z]*$", "Nama akhir tak-valid" ) )

                    namaAkhirTextBox.Select(); // menyeleksi TextBox tak-valid
else if ( !ValidasiMasukan( namaPertamaTextBox.Text,
    "^[A-Z][a-zA-Z]*$", "Nama pertama tak-valid" ) )

                    namaPertamaTextBox.Select(); // menyeleksi TextBox tak-valid
else if ( !ValidasiMasukan( alamatTextBox.Text,
    @"^[0-9]+\s+([a-zA-Z]+|[a-zA-Z]+\s[a-zA-Z]+)$",
    "Alamat tak-valid" ) )

                    alamatTextBox.Select(); // menyeleksi TextBox tak-valid
else if (!ValidasiMasukan(kotaTextBox.Text,
    @"^([a-zA-Z]+|[a-zA-Z]+\s[a-zA-Z]+)$", "Kota tak-valid" ) )

                    kotaTextBox.Select(); // menyeleksi TextBox tak-valid
else if (!ValidasiMasukan(propinsiTextBox.Text,
    @"^([a-zA-Z]+|[a-zA-Z]+\s[a-zA-Z]+)$", "Propinsi tak-valid" ) )

                    propinsiTextBox.Select(); // menyeleksi TextBox tak-valid
else if (!ValidasiMasukan(kodePosTextBox.Text,
    @"^\d{5}$", "Kode pos tak-valid" ) )

                    kodePosTextBox.Select(); // menyeleksi TextBox tak-valid
else if (!ValidasiMasukan(teleponTextBox.Text,
    @"^[1-9]\d{2}-[1-9]\d{2}-\d{4}$",
    "Nomor telepon tak-valid" ) )

                    teleponTextBox.Select(); // menyeleksi TextBox tak-valid
                else // jika semua masukan valid
                {
                    this.Hide(); // hide main window
                    MessageBox.Show( "Terima Kasih!", "Informasi Tepat",
                    MessageBoxButtons.OK, MessageBoxIcon.Information );
                    Application.Exit(); // exit the application
                } // akhir else
            } // akhir else
        } // akhir metode okButton_Click
    
         // menggunakan ekspresi reguler untuk memvalidasi masukan pengguna
        private bool ValidasiMasukan(
            string masukan, string ekspresi, string pesan )
        {
            // menyimpan apakah masukan valid
            bool valid = Regex.Match( masukan, ekspresi ).Success;

            // jika masukan tidak cocok dengan ekspresi reguler
            if ( !valid )
            {
                // memberitahu pengguna bahwa masukan tak-valid
                MessageBox.Show( pesan, "Masukan Tak-Valid",
                MessageBoxButtons.OK, MessageBoxIcon.Error );
            } // akhir if

            return valid; // menghasilkan apakah masukan valid
        } // akhir metode ValidasiMasukan
    } // akhir kelasi ValidasiForm
} // akhir namespace Validasi



Ketika pengguna mengklik OK, program menggunakan suatu LINQ query untuk menyeleksi sembarang TextBox yang kosong (baris 22-27) dari koleksi Controls. Perhatikan bahwa Anda secara eksplisit mendeklarasikan tipe dari variabel rentang di dalam klausa from (baris 22). Ketika bekerja dengan koleksi tak-generik, seperti Controls, Anda harus secara eksplisit memberikan tipe terhadap variabel rentang. Klausa where yang pertama (baris 23) menentukan apakah kendaliSekarang merupakan suatu TextBox. Klausa let (baris 24) menciptakan dan menginisialisasi suatu variabel di dalam LINQ query untuk digunakan nanti pada query. Di sini, Anda menggunakan klausa let untuk mendefinisikan variabel kotak sebagai sebuah TextBox, yang memuat objek Control yang dicast (dikonversi paksa) menjadi sebuah TextBox. Ini memampukan Anda untuk menggunakan kontrol di dalam LINQ query sebagai TextBox, yang memampukan akses terhadap properti-propertinya (seperti Text). Anda perlu mencantumkan klausa where yang kedua setelah klausa let. Klausa where yang kedua menentukan apakah properti Text dari TextBox kosong. Jika satu atau lebih TextBox kosong (baris 30), maka program akan menampilkan sebuah pesan kepada pengguna (baris 33-35) bahwa semua bidang harus diisi sebelum program dapat memvalidasi informasi. Baris 37 memanggil metode Select dari TextBox yang pertama pada hasil query sehingga pengguna dapat memulai mengetik pada TextBox. Query mengurutkan semua TextBox berdasarkan TabIndex (baris 26) sehingga TextBox yang pertama pada hasil query merupakan TextBox kosong pertama pada Form. Jika tidak ada bidang yang kosong, maka baris 39-71 akan memvalidasi masukan pengguna.



Anda memanggil metode ValidasiMasukan untuk menentukan apakah masukan pengguna cocok dengan ekspresi reguler yang ditetapkan. ValidasiMasukan (baris 83-98) mengambil sebagai argumen masukan teks yang diberikan pengguna (masukan), ekspresi reguler yang harus dicocokkan (ekspresi), dan sebuah pesan untuk ditampilkan jika masukan tak-valid (pesan). Baris 87 memanggil metode static Regex, yang melewatkan string yang akan divalidasi dan ekspresi reguler sebagai argumennya. Properti Success dari kelas Match mengindikasikan apakah argumen pertama pada Match cocok dengan pola yang ditetapkan oleh ekspresi reguler pada argumen kedua. Jika nilai dari Success adalah false (tidak ada kecocokan), maka baris 93-94 akan menampilkan pesan error yang dilewatkan sebagai argumen kepada metode ValidasiMasukan. Baris 97 kemudian menghasilkan nilai dari properti Success. Jika ValidasiMasukan menghasilkan false, maka TextBox yang memuat data tak-valid akan dipilih sehingga pengguna dapa mengkoreksi masukan. Jika semua masukan valid, maka statemen else (baris 72-78) akan menampilkan sebuah dialog pesan yang menyatakan bahwa semua masukan valid dan program berhenti ketika pengguna menutup dialog tersebut.

Pada contoh sebelumnya, Anda telah melakukan pencarian terhadap substring-substring pada suatu string yang cocok dengan suatu ekspresi reguler. Pada contoh ini, Anda ingin memastikan bahwa keseluruhan string untuk tiap masukan sesuai dengan ekspresi reguler tertentu. Sebagai contoh, Anda akan menerima “Sutanto” sebagai nama akhir, tetapi tidak “9@Sutanto#”. Pada ekspresi reguler yang diawali dengan karakter “^” dan diakhiri dengan karakter “$” (baris 43), kedua karakter itu merepresentasikan awal dan akhir suatu string. Kedua karakter itu memaksa ekspresi reguler untuk menghasilkan kecocokan hanya jika keseluruhan string yang sedang diproses cocok dengan ekspresi reguler.

Ekspresi reguler pada baris 43 dan 47 menggunakan sebuah kelas karakter untuk mencocokkan suatu huruf pertama yang berupa huruf besar, selanjutnya a-z mencocokkan sembarang huruf kecil, dan A-Z mencocokkan sembarang huruf besar. Pengkuantifikasi * menandakan bahwa rentang karakter yang kedua dapat terjadi nol kali atau lebih di dalam string. Jadi, ekspresi ini mencocokkan sembarang string yang memuat satu huruf besar, yang diikuti dengan satu atau lebih huruf-huruf lainnya.

Kelas karakter \s mencocokkan suatu karakter spasi-putih (baris 51, 56, dan 60). Pada ekspresi “\d{5}”, yang digunakan untuk string kodePos (baris 64), {5} merupakan sebuah pengkuantifikasi. Pola di sebelah kiri dari {n} harus terjadi persis sebanyak n kali. Jadi, “\d{5}” mencocokkan sembarang lima dijit. Ingat bahwa karakter “|” (baris 51, 56, dan 60) mencocokkan ekspresi di sebelah kiri atau ekspresi di sebelah kanannya. Pada baris 51, Anda menggunakan karakter “|” untuk mengindikasikan bahwa alamat dapat memuat sebuah kata yang memuat satu atau lebih karakter atau sebuah kata yang memuat satu atau lebih karakter yang diikuti dengan sebuah spasi dan kata lain yang memuat satu atau lebih karakter. Perhatikan kegunaan dari sepasang kurung untuk mengelompokkan ekspresi reguler. Ini memastikan bahwa “|” diterapkan terhadap bagian-bagian pola secara tepat.

Kedua TextBox, Nama Akhir: dan Nama Pertama:, masing-masing menerima string yang diawali dengan sebuah huruf besar (baris 43 dan 47). Ekspresi reguler untuk TextBox Alamat: (baris 51) mencocokkan sedikitnya satu dijit, yang diikuti dengan sebuah spasi dan kemudian satu atau lebih huruf atau satu atau lebih huruf yang diikuti dengan sebuah spasi dan sederet satu atau lebih huruf.

3.17 Metode Replace dan Split dari Kelas Regex
Kadangkala diperlukan untuk mengganti sebagian dari sebuah string atau untuk memecah sebuah string sesuai dengan suatu ekspresi reguler. Untuk itu, kelas Regex menyediakan beberapa versi metode Replace dan Split, yang didemonstrasikan pada Gambar 3.21.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// Gambar 3.21: SubstitusiRegex.cs
// Menggunakan metode Replace dan Split dan kelas Regex.
using System;
using System.Text.RegularExpressions;

class SubstitusiRegex
{
    static void Main( string[] args )
    {
        string stringUji1 = "Kalimat ini diakhiri dengan 5 bintang *****";
        string stringUji2 = "1, 2, 3, 4, 5, 6, 7, 8";
        Regex ujiRegex1 = new Regex( @"\d" );
        string keluaran = string.Empty;

        Console.WriteLine( "String uji pertama: {0}", stringUji1 );

        // mengganti setiap '*' dengan '^' dan menampilkan hasilnya
        stringUji1 = Regex.Replace( stringUji1, @"\*", "^" );
        Console.WriteLine( "^ menggantikan *: {0}", stringUji1 );

        // mengganti kata "bintang" dengan "star" dan menampilkan hasilnya
        stringUji1 = Regex.Replace( stringUji1, "bintang", "star" );
        Console.WriteLine( "\"star\" menggantikan \"bintang\": {0}",
            stringUji1 );

        // mengganti setiap kata dengan "kata" dan menampilkan hasilnya
        Console.WriteLine( "Setiap kata diganti dengan \"kata\": {0}",
            Regex.Replace( stringUji1, @"\w+", "kata" ) );

        Console.WriteLine( "\nString uji kedua: {0}", stringUji2 );

        // mengganti tiga dijit pertama dengan kata "dijit"
        Console.WriteLine( "Mengganti tiga dijit pertama dengan \"dijit\": {0}",
            ujiRegex1.Replace( stringUji2, "dijit", 3 ) );

        Console.Write( "string dipecah pada koma [" );

        // memecah string menjadi string-string individual, masing-masing memuat sebuah dijit
        string[] hasil = Regex.Split( stringUji2, @",\s" );

        // menambahkan setiap dijit pada string keluaran
        foreach( var stringHasil in hasil )
            keluaran += "\"" + stringHasil + "\", ";

        // menghapus ", " di akhir string keluaran
        Console.WriteLine( keluaran.Substring( 0, keluaran.Length - 2 ) + "]" );
    } // akhir Main
} // akhir kelas SubstitusiRegex

String uji pertama: Kalimat ini diakhiri dengan 5 bintang *****
^ menggantikan *: Kalimat ini diakhiri dengan 5 bintang ^^^^^
"star" menggantikan "bintang": Kalimat ini diakhiri dengan 5 star ^^^^^
Setiap kata diganti dengan "kata": kata kata kata kata kata kata ^^^^^

String uji kedua: 1, 2, 3, 4, 5, 6, 7, 8
Mengganti tiga dijit pertama dengan "dijit": dijit, dijit, dijit, 4, 5, 6, 7, 8
string dipecah pada koma ["1", "2", "3", "4", "5", "6", "7", "8"]

Metode Replace dari kelas Regex mengganti teks pada sebuah string dengan teks baru ketika string asli cocok dengan ekspresi reguler. Anda menggunakan dua versi dari metode ini pada Gambar 3.21. Versi pertama (baris 18) merupakan sebuah metode static yang mengambil tiga parameter, yaitu string yang akan dimodifikasi, string yang memuat ekspresi reguler, dan string pengganti.

Versi kedua dari metode Replace (baris 34) menggunakan ekspresi reguler yang dilewatkan kepada konstruktor untuk ujiRegex1 (baris 12) untuk melakukan operasi penggantian. Baris 12 menginstansiasi ujiRegex1 dengan argumen @”\d”. Pemanggilan terhadap metode Replace pada baris 34 memerlukan tiga argumen, yaitu sebuah string yang akan dimodifikasi, sebuah string yang memuat teks pengganti, dan sebuah integer yang menetapkan jumlah penggantian yang akan dilakukan. Pada kasus ini, baris 34 mengganti tiga kemunculan pertama dari sebuah dijit (“\d”) pada stringUji2 dengan teks “dijit”.







No comments:

Post a Comment