Cara kanggo nggarap grup sing dijupuk
Kode sumber aplikasiRegexDemo
kalebu panggilan metode m.group()
. Metode kasebut group()
minangka salah sawijining metode kelas Matcher
sing dituju kanggo nggarap klompok sing dijupuk:
-
Cara kasebut
int groupCount()
ngasilake jumlah klompok sing dijupuk ing pola solver. Nomer iki ora nganggep nomer grup panangkepan khusus 0, sing cocog karo pola sakabehe. -
Cara kasebut
String group()
ngasilake karakter saka pertandhingan sadurunge sing ditemokake. Kanggo nglaporake telusuran sing sukses kanggo string kosong, cara iki ngasilake string kosong. Yen solver durung nindakake panelusuran utawa operasi golek sadurunge gagal, pangecualian bakal dibuwangIllegalStateException
. -
Cara iki
String group(int group)
padha karo cara sadurunge, kajaba iku ngasilake karakter saka match sadurungé ketemu, dijupuk dening nomer grup sing ditemtokake dening parametergroup
. Elinga yen ikigroup(0)
padha karogroup()
. Yen cithakan ora duwe klompok dijupuk karo nomer diwenehi, cara mbalang pangecualianIndexOutOfBoundsException
. Yen solver durung nindakake panelusuran utawa operasi golek sadurunge gagal, pangecualian bakal dibuwangIllegalStateException
. -
Cara kasebut
String group(String name)
ngasilake karakter saka pertandhingan sadurunge sing ditemokake, dijupuk dening klompok jeneng. Yen jeneng grup sing dijupuk ora ana ing cithakan, pangecualian bakal dibuwangIllegalArgumentException
. Yen solver durung nindakake panelusuran utawa operasi golek sadurunge gagal, pangecualian bakal dibuwangIllegalStateException
.
groupCount()
lan 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
Cara kanggo nemtokake posisi match
Kelas kasebutMatcher
nyedhiyakake sawetara cara sing ngasilake posisi wiwitan lan pungkasan saka pertandhingan:
-
Cara kasebut
int start()
ngasilake posisi wiwitan saka pertandhingan sadurunge sing ditemokake. Yen solver durung nindakake panelusuran utawa operasi golek sadurunge gagal, pangecualian bakal dibuwangIllegalStateException
. -
Cara kasebut
int start(int group)
padha karo cara sadurunge, nanging ngasilake posisi wiwitan pertandhingan sadurunge sing ditemokake kanggo grup sing nomer kasebut ditemtokake dening parametergroup
. Yen cithakan ora duwe klompok dijupuk karo nomer diwenehi, cara mbalang pangecualianIndexOutOfBoundsException
. Yen solver durung nindakake panelusuran utawa operasi golek sadurunge gagal, pangecualian bakal dibuwangIllegalStateException
. -
Cara kasebut
int start(String name)
padha karo cara sadurunge, nanging ngasilake posisi wiwitan pertandhingan sadurunge sing ditemokake kanggo grup sing diaraniname
. Yen grup sing dijupukname
ora ana ing cithakan, pangecualian dibuwangIllegalArgumentException
. Yen solver durung nindakake panelusuran utawa operasi golek sadurunge gagal, pangecualian bakal dibuwangIllegalStateException
. -
Cara
int end()
ngasilake posisi karakter pungkasan saka pertandhingan sadurunge sing ditemokake plus 1. Yen matcher durung nindakake pertandhingan utawa operasi telusuran sadurunge gagal, pangecualian dibuwangIllegalStateException
. -
Cara kasebut
int end(int group)
padha karo cara sadurunge, nanging ngasilake posisi pungkasan saka pertandhingan sadurunge sing ditemokake kanggo grup sing nomer kasebut ditemtokake dening parametergroup
. Yen cithakan ora duwe klompok dijupuk karo nomer diwenehi, cara mbalang pangecualianIndexOutOfBoundsException
. Yen solver durung nindakake panelusuran utawa operasi golek sadurunge gagal, pangecualian bakal dibuwangIllegalStateException
. -
Cara kasebut
int end(String name)
padha karo cara sadurunge, nanging ngasilake posisi pungkasan saka pertandhingan sadurunge sing ditemokake kanggo grup sing diaraniname
. Yen grup sing dijupukname
ora ana ing cithakan, pangecualian dibuwangIllegalArgumentException
. Yen solver durung nindakake panelusuran utawa operasi golek sadurunge gagal, pangecualian bakal dibuwangIllegalStateException
.
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 saka conto iki yaiku:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8
Metode saka kelas PatternSyntaxException
Kayata kelasPatternSyntaxException
nggambarake kesalahan sintaks ing ekspresi reguler. Mbuwang pangecualian kuwi saka cara compile()
lan matches()
kelas Pattern
, lan kawangun liwat konstruktor ing ngisor iki: PatternSyntaxException(String desc, String regex, int index)
Konstruktor iki nyimpen gambaran kasebut ( desc
), expression biasa ( regex
), lan posisi ing kesalahan sintaksis. Yen lokasi kesalahan sintaks ora dingerteni, nilai kasebut index
disetel menyang -1
. Paling kamungkinan, sampeyan ora bakal perlu kanggo nggawe conto saka PatternSyntaxException
. Nanging, sampeyan kudu ngekstrak nilai ing ndhuwur nalika nggawe pesen kesalahan sing diformat. Kanggo nindakake iki, sampeyan bisa nggunakake cara ing ngisor iki:
- Cara kasebut
String getDescription()
ngasilake katrangan babagan kesalahan sintaksis. - Cara kasebut
int getIndex()
ngasilake salah siji posisi sing ana kesalahan, utawa -1 yen posisi ora dingerteni. - Cara kasebut
String getPattern()
ngasilake ekspresi reguler sing ora bener.
String getMessage()
ngasilake senar multiline kanthi nilai sing dibalekake saka metode sadurunge bebarengan karo indikasi visual ing ngendi kesalahan sintaks dumadi ing cithakan. Apa kesalahan sintaksis? Punika conto: java RegexDemo (?itree Treehouse
Ing kasus iki, kita kelalen nemtokake metakarakter kurung nutup ( )
) ing ekspresi gendéra nested. Iki minangka output saka kesalahan iki:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree
Mbangun Aplikasi Ekspresi Reguler Migunani Nggunakake API Regex
Ekspresi reguler ngidini sampeyan nggawe aplikasi pangolahan teks sing kuat. Ing bagean iki, kita bakal nuduhake sampeyan rong aplikasi praktis sing muga-muga bisa nyengkuyung sampeyan supaya luwih njelajah kelas lan metode API Regex. Apendiks kapindho ngenalake Lexan: perpustakaan kode sing bisa digunakake maneh kanggo nindakake analisis leksikal.Ekspresi reguler lan dokumentasi
Dokumentasi minangka salah sawijining tugas wajib nalika ngembangake piranti lunak profesional. Untunge, ekspresi reguler bisa mbantu akeh aspek nggawe dokumentasi. Kode ing Listing 1 ngekstrak baris sing ngemot komentar gaya C siji-baris lan multiline saka file sumber lan nulis menyang file liyane. Supaya kode bisa digunakake, komentar kudu ana ing baris sing padha. Listing 1. Nompo 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;
}
}
}
Cara main()
ing Listing 1 pisanan mriksa sintaks baris perintah sing bener banjur nyusun ekspresi reguler sing dirancang kanggo ndeteksi komentar siji lan multi-baris menyang obyek kelas Pattern
. Yen ora ana pangecualian PatternSyntaxException
, metode kasebut main()
mbukak file sumber, nggawe file target, entuk matcher sing cocog karo saben baris sing diwaca karo pola kasebut, banjur maca file sumber baris kanthi baris. Kanggo saben baris, dicocogake karo pola komentar. Yen kasil, cara main()
nulis string (diterusake karo baris anyar) menyang file target (kita bakal nutupi logika I/O file ing tutorial Java 101 ing mangsa ngarep). Kompilasi Listing 1 kaya ing ngisor iki: javac ExtCmnt.java
Jalanake aplikasi kanthi file ExtCmnt.java
minangka input: java ExtCmnt ExtCmnt.java out
Sampeyan kudu entuk asil ing ngisor iki ing file metu:
// Следующий шаблон определяет многострочные комментарии,
// располагающиеся в одной строке (например, /* одна строка */)
// и однострочные комментарии (например, // Howая-то строка).
// Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
if (m.matches()) /* Должна соответствовать вся строка */
Ing senar pola .*/\\*.*\\*/|.*//.*$
, metacharacter pipe |
tumindak minangka operator UTAWA logis, nuduhake yen matcher kudu nggunakake operan kiwa saka wangun expression biasa diwenehi kanggo nemokake match ing teks matcher. Yen ora ana sing cocog, matcher nggunakake operan sing bener saka konstruk ekspresi reguler sing diwenehake kanggo upaya panelusuran liyane (metakarakter kurung ing grup sing dijupuk uga mbentuk operator logis). Ungkapan Biasa ing Basa Jawa, Part 5
GO TO FULL VERSION