Metode untuk bekerja dengan kelompok yang ditangkap
Kode sumber aplikasiRegexDemo
menyertakan pemanggilan metode m.group()
. Metode ini group()
adalah salah satu dari beberapa metode kelas Matcher
yang 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 diberikanIllegalStateException
. -
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 parametergroup
. Perhatikan bahwa inigroup(0)
setara dengangroup()
. Jika templat tidak memiliki grup yang diambil dengan nomor tertentu, metode ini akan memunculkan pengecualianIndexOutOfBoundsException
. Jika penyelesai belum melakukan pencarian atau operasi pencarian sebelumnya gagal, pengecualian akan diberikanIllegalStateException
. -
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 diberikanIllegalArgumentException
. Jika penyelesai belum melakukan pencarian atau operasi pencarian sebelumnya gagal, pengecualian akan diberikanIllegalStateException
.
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
Metode untuk menentukan posisi pertandingan
Kelas iniMatcher
menyediakan 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 diberikanIllegalStateException
. -
Caranya
int start(int group)
mirip dengan cara sebelumnya, namun mengembalikan posisi awal dari kecocokan sebelumnya yang ditemukan untuk grup yang nomornya ditentukan oleh parametergroup
. Jika templat tidak memiliki grup yang diambil dengan nomor tertentu, metode ini akan memunculkan pengecualianIndexOutOfBoundsException
. Jika penyelesai belum melakukan pencarian atau operasi pencarian sebelumnya gagal, pengecualian akan diberikanIllegalStateException
. -
Metode ini
int start(String name)
serupa dengan metode sebelumnya, namun mengembalikan posisi awal dari kecocokan sebelumnya yang ditemukan untuk grup yang disebutname
. Jika grup yang diambilname
tidak ada dalam templat, pengecualian akan diberikanIllegalArgumentException
. Jika penyelesai belum melakukan pencarian atau operasi pencarian sebelumnya gagal, pengecualian akan diberikanIllegalStateException
. -
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 diberikanIllegalStateException
. -
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 parametergroup
. Jika templat tidak memiliki grup yang diambil dengan nomor tertentu, metode ini akan memunculkan pengecualianIndexOutOfBoundsException
. Jika penyelesai belum melakukan pencarian atau operasi pencarian sebelumnya gagal, pengecualian akan diberikanIllegalStateException
. -
Metode ini
int end(String name)
serupa dengan metode sebelumnya, namun mengembalikan posisi akhir dari kecocokan sebelumnya yang ditemukan untuk grup yang disebutname
. Jika grup yang diambilname
tidak ada dalam templat, pengecualian akan diberikanIllegalArgumentException
. Jika penyelesai belum melakukan pencarian atau operasi pencarian sebelumnya gagal, pengecualian akan diberikanIllegalStateException
.
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 kelasPatternSyntaxException
menjelaskan 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 index
diatur 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.
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 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 komentarimport 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.java
sebagai 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
GO TO FULL VERSION