Kaedah untuk bekerja dengan kumpulan yang ditangkap
Kod sumber aplikasiRegexDemo
termasuk panggilan kaedah m.group()
. Kaedah ini group()
adalah salah satu daripada beberapa kaedah kelas Matcher
yang bertujuan untuk bekerja dengan kumpulan yang ditangkap:
-
Kaedah ini
int groupCount()
mengembalikan bilangan kumpulan yang ditangkap dalam corak penyelesai. Nombor ini tidak mengambil kira nombor kumpulan tangkapan khas 0, yang sepadan dengan corak secara keseluruhan. -
Kaedah ini
String group()
mengembalikan watak padanan sebelumnya yang ditemui. Untuk melaporkan carian yang berjaya untuk rentetan kosong, kaedah ini mengembalikan rentetan kosong. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkanIllegalStateException
. -
Kaedah ini
String group(int group)
serupa dengan kaedah sebelumnya, kecuali ia mengembalikan aksara padanan sebelumnya, yang ditangkap oleh nombor kumpulan yang ditentukan oleh parametergroup
. Ambil perhatian bahawa inigroup(0)
bersamaan dengangroup()
. Jika templat tidak mempunyai kumpulan yang ditangkap dengan nombor yang diberikan, kaedah itu membuang pengecualianIndexOutOfBoundsException
. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkanIllegalStateException
. -
Kaedah ini
String group(String name)
mengembalikan watak padanan sebelumnya yang ditemui, ditangkap oleh kumpulan nama. Jika nama kumpulan yang ditangkap tiada dalam templat, pengecualian akan dilemparkanIllegalArgumentException
. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkanIllegalStateException
.
groupCount()
dan 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));
Keputusan pelaksanaan:
3
0: abc
1: abc
2: bc
3: c
Kaedah untuk menentukan kedudukan perlawanan
KelasMatcher
menyediakan beberapa kaedah yang mengembalikan kedudukan permulaan dan penamat perlawanan:
-
Kaedah ini
int start()
mengembalikan kedudukan permulaan perlawanan sebelumnya yang ditemui. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkanIllegalStateException
. -
Kaedah ini
int start(int group)
serupa dengan kaedah sebelumnya, tetapi mengembalikan kedudukan permulaan padanan sebelumnya yang ditemui untuk kumpulan yang nombornya ditentukan oleh parametergroup
. Jika templat tidak mempunyai kumpulan yang ditangkap dengan nombor yang diberikan, kaedah itu membuang pengecualianIndexOutOfBoundsException
. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkanIllegalStateException
. -
Kaedah ini
int start(String name)
serupa dengan kaedah sebelumnya, tetapi mengembalikan kedudukan permulaan perlawanan sebelumnya yang ditemui untuk kumpulan yang dipanggilname
. Jika kumpulan yang ditangkapname
tiada dalam templat, pengecualian akan dilemparkanIllegalArgumentException
. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkanIllegalStateException
. -
Kaedah ini
int end()
mengembalikan kedudukan aksara terakhir padanan sebelumnya yang ditemui tambah 1. Jika pemadan belum melakukan perlawanan atau operasi carian sebelumnya gagal, pengecualian akan dilemparkanIllegalStateException
. -
Kaedah ini
int end(int group)
serupa dengan kaedah sebelumnya, tetapi mengembalikan kedudukan akhir padanan sebelumnya yang ditemui untuk kumpulan yang nombornya ditentukan oleh parametergroup
. Jika templat tidak mempunyai kumpulan yang ditangkap dengan nombor yang diberikan, kaedah itu membuang pengecualianIndexOutOfBoundsException
. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkanIllegalStateException
. -
Kaedah ini
int end(String name)
serupa dengan kaedah sebelumnya, tetapi mengembalikan kedudukan penamat pada perlawanan sebelumnya yang ditemui untuk kumpulan yang dipanggilname
. Jika kumpulan yang ditangkapname
tiada dalam templat, pengecualian akan dilemparkanIllegalArgumentException
. Jika penyelesai belum lagi melakukan carian atau operasi carian sebelumnya gagal, pengecualian akan dilemparkanIllegalStateException
.
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 contoh ini adalah seperti berikut:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8
Kaedah kelas PatternSyntaxException
Contoh kelasPatternSyntaxException
menerangkan ralat sintaks dalam ungkapan biasa. Melemparkan pengecualian sedemikian daripada kaedah compile()
dan matches()
kelas Pattern
, dan dibentuk melalui pembina berikut: PatternSyntaxException(String desc, String regex, int index)
Pembina ini menyimpan penerangan yang ditentukan ( desc
), ungkapan biasa ( regex
), dan kedudukan di mana ralat sintaks berlaku. Jika lokasi ralat sintaks tidak diketahui, nilai index
ditetapkan kepada -1
. Kemungkinan besar, anda tidak perlu membuat contoh PatternSyntaxException
. Walau bagaimanapun, anda perlu mengekstrak nilai di atas apabila membuat mesej ralat terformat. Untuk melakukan ini, anda boleh menggunakan kaedah berikut:
- Kaedah ini
String getDescription()
mengembalikan penerangan tentang ralat sintaks. - Kaedah
int getIndex()
mengembalikan sama ada kedudukan di mana ralat berlaku, atau -1 jika kedudukan tidak diketahui. - Kaedah ini
String getPattern()
mengembalikan ungkapan biasa yang tidak sah.
String getMessage()
mengembalikan rentetan berbilang baris dengan nilai yang dikembalikan daripada kaedah sebelumnya bersama-sama dengan petunjuk visual tempat ralat sintaks berlaku dalam templat. Apakah ralat sintaks? Berikut ialah contoh: java RegexDemo (?itree Treehouse
Dalam kes ini, kami terlupa untuk menentukan metacharacter kurungan penutup ( )
) dalam ungkapan bendera bersarang. Inilah yang dihasilkan daripada ralat ini:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree
Bina Aplikasi Ekspresi Biasa Berguna Menggunakan API Regex
Ungkapan biasa membolehkan anda mencipta aplikasi pemprosesan teks yang berkuasa. Dalam bahagian ini, kami akan menunjukkan kepada anda dua aplikasi berguna yang diharapkan akan menggalakkan anda untuk meneroka kelas dan kaedah API Regex dengan lebih lanjut. Lampiran kedua memperkenalkan Lexan: perpustakaan kod yang boleh digunakan semula untuk melaksanakan analisis leksikal.Ekspresi biasa dan dokumentasi
Dokumentasi adalah salah satu tugas wajib apabila membangunkan perisian profesional. Nasib baik, ungkapan biasa boleh membantu anda dengan banyak aspek penciptaan dokumentasi. Kod dalam Penyenaraian 1 mengekstrak baris yang mengandungi komen gaya C satu baris dan berbilang baris daripada fail sumber dan menulisnya ke fail lain. Untuk kod berfungsi, ulasan mesti berada pada baris yang sama. Penyenaraian 1. Mendapatkan semula komenimport 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;
}
}
}
Kaedah main()
dalam Penyenaraian 1 mula-mula menyemak sintaks baris perintah yang betul dan kemudian menyusun ungkapan biasa yang direka untuk mengesan komen tunggal dan berbilang baris ke dalam objek kelas Pattern
. Jika tiada pengecualian dibangkitkan PatternSyntaxException
, kaedah main()
membuka fail sumber, mencipta fail sasaran, memperoleh pemadan untuk memadankan setiap baris yang dibaca dengan corak, dan kemudian membaca fail sumber baris demi baris. Untuk setiap baris, ia dipadankan dengan corak ulasan. Jika berjaya, kaedah main()
menulis rentetan (diikuti dengan baris baharu) ke fail sasaran (kami akan merangkumi logik I/O fail dalam tutorial Java 101 akan datang). Susun Penyenaraian 1 seperti berikut: javac ExtCmnt.java
Jalankan aplikasi dengan fail ExtCmnt.java
sebagai input: java ExtCmnt ExtCmnt.java out
Anda harus mendapatkan hasil berikut dalam fail keluar:
// Следующий шаблон определяет многострочные комментарии,
// располагающиеся в одной строке (например, /* одна строка */)
// и однострочные комментарии (например, // Howая-то строка).
// Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
if (m.matches()) /* Должна соответствовать вся строка */
Dalam rentetan corak .*/\\*.*\\*/|.*//.*$
, metacharacter paip |
bertindak sebagai operator OR logik, menunjukkan bahawa pemadan harus menggunakan operan kiri binaan ungkapan biasa yang diberikan untuk mencari padanan dalam teks pemadan. Jika tiada padanan, pemadan menggunakan operan yang betul daripada binaan ungkapan biasa yang diberikan untuk percubaan carian lain (metakarakter kurungan dalam kumpulan yang ditangkap juga membentuk operator logik). Ungkapan Biasa di Jawa, Bahagian 5
GO TO FULL VERSION