JavaRush /Java Blog /Random-ID /Ekspresi Reguler di Java, Bagian 4

Ekspresi Reguler di Java, Bagian 4

Dipublikasikan di grup Random-ID
Untuk perhatian Anda, kami mempersembahkan terjemahan panduan singkat ekspresi reguler di Java, yang ditulis oleh Jeff Friesen untuk situs web javaworld . Untuk kemudahan membaca, kami telah membagi artikel menjadi beberapa bagian. Ekspresi Reguler di Java, Bagian 4 - 1 Ekspresi Reguler di Java, Bagian 1 Ekspresi Reguler di Java, Bagian 2 Ekspresi Reguler di Java, Bagian 3

Metode untuk bekerja dengan kelompok yang ditangkap

Kode sumber aplikasi RegexDemomenyertakan pemanggilan metode m.group(). Metode ini group()adalah salah satu dari beberapa metode kelas Matcheryang ditujukan untuk bekerja dengan kelompok yang ditangkap:
  • Metode ini int groupCount()mengembalikan jumlah grup yang ditangkap dalam pola penyelesai. Angka ini tidak memperhitungkan kelompok tangkapan khusus nomor 0, yang sesuai dengan pola secara keseluruhan.

  • Metode ini String group()mengembalikan karakter dari kecocokan yang ditemukan sebelumnya. Untuk melaporkan pencarian string kosong yang berhasil, metode ini mengembalikan string kosong. Jika penyelesai belum melakukan pencarian atau operasi pencarian sebelumnya gagal, pengecualian akan diberikan IllegalStateException.

  • Metode ini String group(int group)mirip dengan metode sebelumnya, hanya saja metode ini mengembalikan karakter dari kecocokan yang ditemukan sebelumnya, ditangkap berdasarkan nomor grup yang ditentukan oleh parameter group. Perhatikan bahwa ini group(0)setara dengan group(). Jika templat tidak memiliki grup yang diambil dengan nomor tertentu, metode ini akan memunculkan pengecualian IndexOutOfBoundsException. Jika penyelesai belum melakukan pencarian atau operasi pencarian sebelumnya gagal, pengecualian akan diberikan IllegalStateException.

  • Metode ini String group(String name)mengembalikan karakter dari kecocokan sebelumnya yang ditemukan, ditangkap berdasarkan nama grup. Jika nama grup yang diambil tidak ada dalam templat, pengecualian akan diberikan IllegalArgumentException. Jika penyelesai belum melakukan pencarian atau operasi pencarian sebelumnya gagal, pengecualian akan diberikan IllegalStateException.

Contoh berikut menunjukkan penggunaan metode groupCount()and group(int group):
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abc");
m.find();
System.out.println(m.groupCount());
for (int i = 0; i <= m.groupCount(); i++)
System.out.println(i + ": " + m.group(i));
Hasil eksekusi:
3
0: abc
1: abc
2: bc
3: c
Ekspresi Reguler di Java, Bagian 4 - 2

Metode untuk menentukan posisi pertandingan

Kelas ini Matchermenyediakan beberapa metode yang mengembalikan posisi awal dan akhir pertandingan:
  • Metode ini int start()mengembalikan posisi awal dari kecocokan yang ditemukan sebelumnya. Jika penyelesai belum melakukan pencarian atau operasi pencarian sebelumnya gagal, pengecualian akan diberikan IllegalStateException.

  • Caranya int start(int group)mirip dengan cara sebelumnya, namun mengembalikan posisi awal dari kecocokan sebelumnya yang ditemukan untuk grup yang nomornya ditentukan oleh parameter group. Jika templat tidak memiliki grup yang diambil dengan nomor tertentu, metode ini akan memunculkan pengecualian IndexOutOfBoundsException. Jika penyelesai belum melakukan pencarian atau operasi pencarian sebelumnya gagal, pengecualian akan diberikan IllegalStateException.

  • Metode ini int start(String name)serupa dengan metode sebelumnya, namun mengembalikan posisi awal dari kecocokan sebelumnya yang ditemukan untuk grup yang disebut name. Jika grup yang diambil nametidak ada dalam templat, pengecualian akan diberikan IllegalArgumentException. Jika penyelesai belum melakukan pencarian atau operasi pencarian sebelumnya gagal, pengecualian akan diberikan IllegalStateException.

  • Metode ini int end()mengembalikan posisi karakter terakhir dari kecocokan sebelumnya yang ditemukan ditambah 1. Jika pencocokan belum melakukan pencocokan atau operasi pencarian sebelumnya gagal, pengecualian akan diberikan IllegalStateException.

  • Metode ini int end(int group)mirip dengan metode sebelumnya, tetapi mengembalikan posisi akhir dari kecocokan sebelumnya yang ditemukan untuk grup yang nomornya ditentukan oleh parameter group. Jika templat tidak memiliki grup yang diambil dengan nomor tertentu, metode ini akan memunculkan pengecualian IndexOutOfBoundsException. Jika penyelesai belum melakukan pencarian atau operasi pencarian sebelumnya gagal, pengecualian akan diberikan IllegalStateException.

  • Metode ini int end(String name)serupa dengan metode sebelumnya, namun mengembalikan posisi akhir dari kecocokan sebelumnya yang ditemukan untuk grup yang disebut name. Jika grup yang diambil nametidak ada dalam templat, pengecualian akan diberikan IllegalArgumentException. Jika penyelesai belum melakukan pencarian atau operasi pencarian sebelumnya gagal, pengecualian akan diberikan IllegalStateException.

Contoh berikut menunjukkan dua metode lokasi pencocokan yang menampilkan posisi pencocokan awal/akhir untuk grup tangkapan nomor 2:
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abcabcabc");
while (m.find())
{
   System.out.println("Найдено " + m.group(2));
   System.out.println("  начинается с позиции " + m.start(2) +
                      " и заканчивается на позиции " + (m.end(2) - 1));
   System.out.println();
}
Output dari contoh ini adalah sebagai berikut:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8

Metode kelas PatternSyntaxException

Sebuah instance dari kelas PatternSyntaxExceptionmenjelaskan kesalahan sintaksis dalam ekspresi reguler. Melempar pengecualian seperti itu dari metode compile()dan matches()kelas Pattern, dan dibentuk melalui konstruktor berikut: PatternSyntaxException(String desc, String regex, int index) Konstruktor ini menyimpan deskripsi yang ditentukan ( desc), ekspresi reguler ( regex), dan posisi di mana kesalahan sintaksis terjadi. Jika lokasi kesalahan sintaksis tidak diketahui, nilainya indexdiatur ke -1. Kemungkinan besar, Anda tidak perlu membuat instance dari file PatternSyntaxException. Namun, Anda perlu mengekstrak nilai di atas saat membuat pesan kesalahan yang diformat. Untuk melakukannya, Anda dapat menggunakan metode berikut:
  • Metode ini String getDescription()mengembalikan deskripsi kesalahan sintaksis.
  • Metode ini int getIndex()mengembalikan posisi di mana kesalahan terjadi, atau -1 jika posisinya tidak diketahui.
  • Metode ini String getPattern()mengembalikan ekspresi reguler yang tidak valid.
Selain itu, metode yang diwarisi String getMessage()mengembalikan string multiline dengan nilai yang dikembalikan dari metode sebelumnya bersama dengan indikasi visual di mana kesalahan sintaksis terjadi pada templat. Apa itu kesalahan sintaksis? Berikut contohnya: java RegexDemo (?itree Treehouse Dalam kasus ini, kita lupa menentukan metakarakter kurung tutup ( )) dalam ekspresi bendera yang disarangkan. Inilah yang dihasilkan dari kesalahan ini:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
   ^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree

Bangun Aplikasi Ekspresi Reguler yang Berguna Menggunakan Regex API

Ekspresi reguler memungkinkan Anda membuat aplikasi pemrosesan teks yang canggih. Di bagian ini, kami akan menunjukkan kepada Anda dua aplikasi praktis yang diharapkan akan mendorong Anda untuk menjelajahi lebih jauh kelas dan metode Regex API. Lampiran kedua memperkenalkan Lexan: pustaka kode yang dapat digunakan kembali untuk melakukan analisis leksikal. Ekspresi Reguler di Java, Bagian 4 - 3

Ekspresi reguler dan dokumentasi

Dokumentasi adalah salah satu tugas wajib ketika mengembangkan perangkat lunak profesional. Untungnya, ekspresi reguler dapat membantu Anda dalam banyak aspek pembuatan dokumentasi. Kode di Listing 1 mengekstrak baris yang berisi komentar gaya C satu baris dan multibaris dari file sumber dan menulisnya ke file lain. Agar kode dapat berfungsi, komentar harus berada pada baris yang sama. Listing 1. Mengambil komentar
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class ExtCmnt
{
   public static void main(String[] args)
   {
      if (args.length != 2)
      {
         System.err.println("Способ применения: java ExtCmnt infile outfile");
         return;
      }

      Pattern p;
      try
      {
         // Следующий шаблон определяет многострочные комментарии,
         // располагающиеся в одной строке (например, /* одна строка */)
            // и однострочные комментарии (например, // Howая-то строка).
            // Комментарий может располагаться в любом месте строки.

         p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
      }
      catch (PatternSyntaxException pse)
      {
         System.err.printf("Синтаксическая ошибка в регулярном выражении: %s%n", pse.getMessage());
         System.err.printf("Описание ошибки: %s%n", pse.getDescription());
         System.err.printf("Позиция ошибки: %s%n", pse.getIndex());
         System.err.printf("Ошибочный шаблон: %s%n", pse.getPattern());
         return;
      }

      try (FileReader fr = new FileReader(args[0]);
           BufferedReader br = new BufferedReader(fr);
           FileWriter fw = new FileWriter(args[1]);
           BufferedWriter bw = new BufferedWriter(fw))
      {
         Matcher m = p.matcher("");
         String line;
         while ((line = br.readLine()) != null)
         {
            m.reset(line);
            if (m.matches()) /* Должна соответствовать вся строка */
            {
               bw.write(line);
               bw.newLine();
            }
         }
      }
      catch (IOException ioe)
      {
         System.err.println(ioe.getMessage());
         return;
      }
   }
}
Metode main()dalam Listing 1 pertama-tama memeriksa sintaks baris perintah yang benar dan kemudian mengkompilasi ekspresi reguler yang dirancang untuk mendeteksi komentar satu dan beberapa baris ke dalam objek kelas Pattern. Jika tidak ada pengecualian yang dimunculkan PatternSyntaxException, metode main()akan membuka file sumber, membuat file target, mendapatkan pencocokan untuk mencocokkan setiap baris yang dibaca dengan pola, dan kemudian membaca file sumber baris demi baris. Untuk setiap baris, dicocokkan dengan pola komentar. Jika berhasil, metode ini main()akan menulis string (diikuti dengan baris baru) ke file target (kita akan membahas logika I/O file di tutorial Java 101 mendatang). Kompilasi Listing 1 sebagai berikut: javac ExtCmnt.java Jalankan aplikasi dengan file ExtCmnt.javasebagai input: java ExtCmnt ExtCmnt.java out Anda akan mendapatkan hasil berikut dalam file out:
// Следующий шаблон определяет многострочные комментарии,
 // располагающиеся в одной строке (например, /* одна строка */)
    // и однострочные комментарии (например, // Howая-то строка).
    // Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
    if (m.matches()) /* Должна соответствовать вся строка */
Dalam pola string .*/\\*.*\\*/|.*//.*$, metakarakter pipa |bertindak sebagai operator logika OR, yang menunjukkan bahwa pencocokan harus menggunakan operan kiri dari konstruksi ekspresi reguler yang diberikan untuk menemukan kecocokan dalam teks pencocokan. Jika tidak ada kecocokan, pencocokan menggunakan operan kanan dari konstruksi ekspresi reguler yang diberikan untuk upaya pencarian lainnya (karakter meta tanda kurung dalam grup yang diambil juga membentuk operator logika). Ekspresi Reguler di Java, Bagian 5
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION