Share via


Mengekstrak substring dari string

Artikel ini membahas beberapa teknik berbeda untuk mengekstraksi bagian dari string.

  • Gunakan Metode pemisahan ketika substring yang Anda inginkan dipisahkan oleh karakter (atau karakter) pembatas yang diketahui.
  • Ekspresi reguler berguna saat string sesuai dengan pola tetap.
  • Gunakan metode IndexOf dan Substring bersamaan jika Anda tidak ingin mengekstrak semua substring dalam sebuah string.

Metode String.Split

String.Split menyediakan beberapa kelebihan untuk membantu Anda memecah string menjadi sekelompok substring berdasarkan satu atau beberapa karakter pembatas yang Anda tentukan. Anda dapat memilih untuk membatasi jumlah total substring dalam hasil akhir, memangkas karakter white space dari substring, atau mengecualikan substring kosong.

Contoh berikut menunjukkan tiga kelebihan beban String.Split() yang berbeda. Contoh pertama memanggil kelebihan Split(Char[]) tanpa meneruskan karakter pemisah apa pun. Jika Anda tidak menentukan karakter pembatas apa pun, String.Split() menggunakan pembatas default, yang merupakan karakter white space, untuk memisahkan string.

string s = "You win some. You lose some.";

string[] subs = s.Split();

foreach (string sub in subs)
{
    Console.WriteLine($"Substring: {sub}");
}

// This example produces the following output:
//
// Substring: You
// Substring: win
// Substring: some.
// Substring: You
// Substring: lose
// Substring: some.
Dim s As String = "You win some. You lose some."
Dim subs As String() = s.Split()

For Each substring As String In subs
    Console.WriteLine("Substring: {0}", substring)
Next

' This example produces the following output:
'
' Substring: You
' Substring: win
' Substring: some.
' Substring: You
' Substring: lose
' Substring: some.

Seperti yang Anda lihat, karakter titik (.) disertakan dalam dua substring. Jika Anda ingin mengecualikan karakter titik, Anda dapat menambahkan karakter titik sebagai karakter pembatas tambahan. Contoh berikutnya menunjukkan bagaimana melakukan hal ini.

string s = "You win some. You lose some.";

string[] subs = s.Split(' ', '.');

foreach (string sub in subs)
{
    Console.WriteLine($"Substring: {sub}");
}

// This example produces the following output:
//
// Substring: You
// Substring: win
// Substring: some
// Substring:
// Substring: You
// Substring: lose
// Substring: some
// Substring:
Dim s As String = "You win some. You lose some."
Dim subs As String() = s.Split(" "c, "."c)

For Each substring As String In subs
    Console.WriteLine("Substring: {0}", substring)
Next

' This example produces the following output:
'
' Substring: You
' Substring: win
' Substring: some
' Substring:
' Substring: You
' Substring: lose
' Substring: some
' Substring:

Titik telah hilang dari substring, tetapi sekarang dua substring kosong tambahan telah disertakan. Substring kosong ini mewakili substring antara kata dan titik yang mengikutinya. Untuk menghilangkan substring kosong dari array yang dihasilkan, Anda dapat memanggil kelebihan beban Split(Char[], StringSplitOptions) dan menentukan StringSplitOptions.RemoveEmptyEntries untuk parameter options.

string s = "You win some. You lose some.";
char[] separators = new char[] { ' ', '.' };

string[] subs = s.Split(separators, StringSplitOptions.RemoveEmptyEntries);

foreach (string sub in subs)
{
    Console.WriteLine($"Substring: {sub}");
}

// This example produces the following output:
//
// Substring: You
// Substring: win
// Substring: some
// Substring: You
// Substring: lose
// Substring: some
Dim s As String = "You win some. You lose some."
Dim separators As Char() = New Char() {" "c, "."c}
Dim subs As String() = s.Split(separators, StringSplitOptions.RemoveEmptyEntries)

For Each substring As String In subs
    Console.WriteLine("Substring: {0}", substring)
Next

' This example produces the following output:
'
' Substring: You
' Substring: win
' Substring: some
' Substring: You
' Substring: lose
' Substring: some

Regex

Jika string Anda sesuai dengan pola tetap, Anda bisa menggunakan ekspresi reguler untuk mengekstrak dan menangani elemennya. Misalnya, jika string berbentuk "numberoperandnumber", Anda dapat menggunakan regex untuk mengekstrak dan menangani elemen string. Berikut contohnya:

String[] expressions = { "16 + 21", "31 * 3", "28 / 3",
                       "42 - 18", "12 * 7",
                       "2, 4, 6, 8" };
String pattern = @"(\d+)\s+([-+*/])\s+(\d+)";

foreach (string expression in expressions)
{
    foreach (System.Text.RegularExpressions.Match m in
    System.Text.RegularExpressions.Regex.Matches(expression, pattern))
    {
        int value1 = Int32.Parse(m.Groups[1].Value);
        int value2 = Int32.Parse(m.Groups[3].Value);
        switch (m.Groups[2].Value)
        {
            case "+":
                Console.WriteLine("{0} = {1}", m.Value, value1 + value2);
                break;
            case "-":
                Console.WriteLine("{0} = {1}", m.Value, value1 - value2);
                break;
            case "*":
                Console.WriteLine("{0} = {1}", m.Value, value1 * value2);
                break;
            case "/":
                Console.WriteLine("{0} = {1:N2}", m.Value, value1 / value2);
                break;
        }
    }
}

// The example displays the following output:
//       16 + 21 = 37
//       31 * 3 = 93
//       28 / 3 = 9.33
//       42 - 18 = 24
//       12 * 7 = 84
Dim expressions() As String = {"16 + 21", "31 * 3", "28 / 3",
                              "42 - 18", "12 * 7",
                              "2, 4, 6, 8"}

Dim pattern As String = "(\d+)\s+([-+*/])\s+(\d+)"
For Each expression In expressions
    For Each m As Match In Regex.Matches(expression, pattern)
        Dim value1 As Integer = Int32.Parse(m.Groups(1).Value)
        Dim value2 As Integer = Int32.Parse(m.Groups(3).Value)
        Select Case m.Groups(2).Value
            Case "+"
                Console.WriteLine("{0} = {1}", m.Value, value1 + value2)
            Case "-"
                Console.WriteLine("{0} = {1}", m.Value, value1 - value2)
            Case "*"
                Console.WriteLine("{0} = {1}", m.Value, value1 * value2)
            Case "/"
                Console.WriteLine("{0} = {1:N2}", m.Value, value1 / value2)
        End Select
    Next
Next

' The example displays the following output:
'       16 + 21 = 37
'       31 * 3 = 93
'       28 / 3 = 9.33
'       42 - 18 = 24
'       12 * 7 = 84

Pola ekspresi reguler (\d+)\s+([-+*/])\s+(\d+) didefinisikan seperti berikut:

Pola Deskripsi
(\d+) Cocokkan satu atau beberapa angka desimal. Ini adalah grup penangkapan pertama.
\s+ Cocokkan satu atau beberapa karakter white space.
([-+*/]) Mencocokkan tanda operator aritmatika (+, -, *, atau /). Ini adalah grup pengambilan kedua.
\s+ Cocokkan satu atau beberapa karakter white space.
(\d+) Cocokkan satu atau beberapa angka desimal. Ini adalah grup pengambilan ketiga.

Anda juga dapat menggunakan ekspresi reguler untuk mengekstrak substring dari string berdasarkan pola daripada kumpulan karakter tetap. Ini adalah skenario umum ketika salah satu dari kondisi berikut terjadi:

  • Satu atau beberapa karakter pembatas tidak selalu berfungsi sebagai pembatas dalam instans String.

  • Urutan dan jumlah karakter pembatas bervariasi atau tidak diketahui.

Misalnya, metode Split tidak dapat digunakan untuk memisahkan string berikut, karena jumlah karakter \n (baris baru) bervariasi, dan tidak selalu berfungsi sebagai pembatas.

[This is captured\ntext.]\n\n[\n[This is more captured text.]\n]
\n[Some more captured text:\n   Option1\n   Option2][Terse text.]

Ekspresi reguler dapat memisahkan string ini dengan mudah, seperti yang ditunjukkan contoh berikut.

String input = "[This is captured\ntext.]\n\n[\n" +
               "[This is more captured text.]\n]\n" +
               "[Some more captured text:\n   Option1" +
               "\n   Option2][Terse text.]";
String pattern = @"\[([^\[\]]+)\]";
int ctr = 0;

foreach (System.Text.RegularExpressions.Match m in
   System.Text.RegularExpressions.Regex.Matches(input, pattern))
{
    Console.WriteLine("{0}: {1}", ++ctr, m.Groups[1].Value);
}

// The example displays the following output:
//       1: This is captured
//       text.
//       2: This is more captured text.
//       3: Some more captured text:
//          Option1
//          Option2
//       4: Terse text.
Dim input As String = String.Format("[This is captured{0}text.]" +
                                  "{0}{0}[{0}[This is more " +
                                  "captured text.]{0}{0}" +
                                  "[Some more captured text:" +
                                  "{0}   Option1" +
                                  "{0}   Option2][Terse text.]",
                                  vbCrLf)
Dim pattern As String = "\[([^\[\]]+)\]"
Dim ctr As Integer = 0
For Each m As Match In Regex.Matches(input, pattern)
    ctr += 1
    Console.WriteLine("{0}: {1}", ctr, m.Groups(1).Value)
Next

' The example displays the following output:
'       1: This is captured
'       text.
'       2: This is more captured text.
'       3: Some more captured text:
'          Option1
'          Option2
'       4: Terse text.

Pola ekspresi reguler \[([^\[\]]+)\] didefinisikan seperti berikut:

Pola Deskripsi
\[ Cocokkan braket pembuka.
([^\[\]]+) Cocokkan karakter apa pun yang bukan kurung buka atau tutup satu kali atau lebih. Ini adalah grup penangkapan pertama.
\] Cocokkan tanda kurung tutup.

Metode Regex.Split hampir sama dengan String.Split, kecuali bahwa metode ini membagi string berdasarkan pola ekspresi reguler, bukan kumpulan karakter tetap. Misalnya, contoh berikut menggunakan metode Regex.Split untuk memisahkan string yang berisi substring yang dibatasi oleh berbagai kombinasi tanda hubung dan karakter lainnya.

String input = "abacus -- alabaster - * - atrium -+- " +
               "any -*- actual - + - armoire - - alarm";
String pattern = @"\s-\s?[+*]?\s?-\s";
String[] elements = System.Text.RegularExpressions.Regex.Split(input, pattern);

foreach (string element in elements)
    Console.WriteLine(element);

// The example displays the following output:
//       abacus
//       alabaster
//       atrium
//       any
//       actual
//       armoire
//       alarm
Dim input As String = "abacus -- alabaster - * - atrium -+- " +
                    "any -*- actual - + - armoire - - alarm"
Dim pattern As String = "\s-\s?[+*]?\s?-\s"
Dim elements() As String = Regex.Split(input, pattern)
For Each element In elements
    Console.WriteLine(element)
Next

' The example displays the following output:
'       abacus
'       alabaster
'       atrium
'       any
'       actual
'       armoire
'       alarm

Pola ekspresi reguler \s-\s?[+*]?\s?-\s didefinisikan seperti berikut:

Pola Deskripsi
\s- Cocokkan karakter white space yang diikuti dengan tanda hubung.
\s? Cocokkan nol atau satu karakter white space.
[+*]? Cocokkan nol atau satu kemunculan karakter + atau *.
\s? Cocokkan nol atau satu karakter white space.
-\s Cocokkan tanda hubung yang diikuti dengan karakter white space.

Metode String.IndexOf dan String.Substring

Jika Anda tidak tertarik dengan semua substring dalam string, Anda mungkin lebih suka bekerja dengan salah satu metode perbandingan string yang mengembalikan indeks tempat kecocokan dimulai. Anda kemudian dapat memanggil metode Substring untuk mengekstrak substring yang diinginkan. Metode perbandingan string meliputi:

  • IndexOf, yang mengembalikan indeks berbasis nol dari kemunculan pertama karakter atau string dalam instans string.

  • IndexOfAny, yang mengembalikan indeks berbasis nol dalam instans string saat ini dari kemunculan pertama karakter apa pun dalam array karakter.

  • LastIndexOf, yang mengembalikan indeks berbasis nol dari kemunculan terakhir karakter atau string dalam instans string.

  • LastIndexOfAny, yang mengembalikan indeks berbasis nol dalam instans string saat ini dari kemunculan terakhir karakter apa pun dalam array karakter.

Contoh berikut menggunakan metode IndexOf untuk menemukan titik dalam string. Kemudian menggunakan metode Substring untuk mengembalikan kalimat lengkap.

String s = "This is the first sentence in a string. " +
               "More sentences will follow. For example, " +
               "this is the third sentence. This is the " +
               "fourth. And this is the fifth and final " +
               "sentence.";
var sentences = new List<String>();
int start = 0;
int position;

// Extract sentences from the string.
do
{
    position = s.IndexOf('.', start);
    if (position >= 0)
    {
        sentences.Add(s.Substring(start, position - start + 1).Trim());
        start = position + 1;
    }
} while (position > 0);

// Display the sentences.
foreach (var sentence in sentences)
    Console.WriteLine(sentence);

// The example displays the following output:
//       This is the first sentence in a string.
//       More sentences will follow.
//       For example, this is the third sentence.
//       This is the fourth.
//       And this is the fifth and final sentence.
    Dim input As String = "This is the first sentence in a string. " +
                        "More sentences will follow. For example, " +
                        "this is the third sentence. This is the " +
                        "fourth. And this is the fifth and final " +
                        "sentence."
    Dim sentences As New List(Of String)
    Dim start As Integer = 0
    Dim position As Integer

    ' Extract sentences from the string.
    Do
        position = input.IndexOf("."c, start)
        If position >= 0 Then
            sentences.Add(input.Substring(start, position - start + 1).Trim())
            start = position + 1
        End If
    Loop While position > 0

    ' Display the sentences.
    For Each sentence In sentences
        Console.WriteLine(sentence)
    Next
End Sub

' The example displays the following output:
'       This is the first sentence in a string.
'       More sentences will follow.
'       For example, this is the third sentence.
'       This is the fourth.
'       And this is the fifth and final sentence.

Lihat juga