Nyederhanakake tugas pemrograman umum nganggo Regex API
Ing Bagean 1 lan 2 artikel iki, sampeyan dikenalake karo ekspresi reguler lan Regex API. Sampeyan sinau babagan kelasPattern
lan ngliwati conto sing nduduhake konstruksi ekspresi reguler, saka pencocokan pola sing prasaja nggunakake string literal nganti pencocokan sing luwih rumit nggunakake rentang, pencocokan wates, lan pengukur. Ing bagean iki lan sakteruse, kita bakal nimbang masalah sing ora dibahas ing bagean pisanan, kita bakal sinau cara kelas sing cocog Pattern
, Matcher
lan PatternSyntaxException
. Sampeyan uga bakal sinau rong utilitas sing nggunakake ekspresi reguler kanggo nggawe masalah pemrograman umum luwih gampang. Sing pertama ngekstrak komentar saka kode kanggo dokumentasi. Kapindho yaiku perpustakaan kode sing bisa digunakake maneh sing dirancang kanggo nindakake analisis leksikal - komponen penting saka assemblers, compiler, lan piranti lunak sing padha.
NGUNDUH KODE SUMBER
Sampeyan bisa njaluk kabeh kode sumber (digawe dening Jeff Friesen kanggo JavaWorld) kanggo aplikasi demo ing artikel iki saka kene .Sinau API Regex
Pattern
, Matcher
lan PatternSyntaxException
telung kelas sing nggawe Regex API. Saben-saben menehi cara sing ngidini sampeyan nggunakake ekspresi reguler ing kode sampeyan.
Metode saka kelas Pola
Instance saka kelasPattern
minangka ekspresi reguler sing dikompilasi, uga dikenal minangka pola. Ekspresi reguler dikompilasi kanggo nambah kinerja operasi pencocokan pola. Cara statis ing ngisor iki ndhukung kompilasi.
Pattern compile(String regex)
nglumpukake isiregex
menyang perwakilan penengah sing disimpen ing anyarPattern
. Cara iki ngasilake referensi menyang obyek yen sukses, utawa mbuwang pengecualianPatternSyntaxException
yen sintaks ekspresi reguler ora bener dideteksi. Sembarang obyek saka kelasMatcher
sing digunakakePattern
utawa bali saka obyek iki nggunakake setelan gawan, kayata telusuran cilik-sensitif. Contone, snippet kodePattern p = Pattern.compile("(?m)^\\.");
nggawe obyekPattern
sing nyimpen perwakilan kompilasi ekspresi reguler kanggo cocog strings sing diwiwiti karo karakter titik.Pattern compile(String regex, int flags)
solves masalah padhaPattern compile(String regex)
, nanging njupuk menyang akunflags
: pesawat saka konstanta bit kanggo gendero bit saka jinis UTAWA. Kelas kasebutPattern
nyatakake konstantaCANON_EQ, CASE_INSENSITIVE, COMMENTS, DOTALL, LITERAL, MULTILINE, UNICODE_CASE, UNICODE_CHARACTER_CLASS и UNIX_LINES
sing bisa digabung nggunakake bitwise UTAWA (contone,CASE_INSENSITIVE | DOTALL
) lan diterusake minangka argumenflags
.
Kajaba saka
CANON_EQ, LITERAL и UNICODE_CHARACTER_CLASS
, konstanta iki minangka alternatif kanggo ekspresi gendera nested sing dituduhake ing Part 1. Yen pancet gendera liyane tinimbang sing ditetepake ing kelas ditemoni Pattern
, metode kasebut Pattern compile(String regex, int flags)
nggawe pengecualian java.lang.IllegalArgumentException
. Contone, Pattern p = Pattern.compile("^\\.", Pattern.MULTILINE);
padha karo conto sadurunge, karo pancet Pattern.MULTILINE
lan expression flag nested (?m)
nindakake bab sing padha.
Pattern
, bebarengan karo gendera sing digunakake. Kanggo nindakake iki, sampeyan bisa nelpon cara ing ngisor iki:
String pattern()
ngasilake string ekspresi reguler asli sing disusun dadiPattern
.int flags()
ngasilake gendera obyekPattern
.
Pattern
, biasane digunakake kanggo njupuk obyek Matcher
kanggo nindakake operasi pencocokan pola. Cara Matcher matcher(Charsequence input)
nggawe obyek Matcher
sing nggoleki teks input
sing cocog karo pola obyek Pattern
. Nalika disebut, iku ngasilake referensi kanggo obyek iki Matcher
. Contone, printah Matcher m = p.matcher(args[1]);
bali Matcher
kanggo obyek Pattern
sing dirujuk dening variabel p
.
Panelusuran siji-wektu |
---|
Cara static boolean matches(String regex, CharSequence input) kelas Pattern ngidini sampeyan ngirit nggawe obyek Pattern lan Matcher telusuran siji-wektu nggunakake cithakan. Cara iki ngasilake bener yen input pola dicocogake regex , yen ora bakal ngasilake palsu. Yen ekspresi reguler ngemot kesalahan sintaks, metode kasebut bakal menehi pengecualian PatternSyntaxException . Contone, System.out.println(Pattern.matches("[a-z[\\s]]*", "all lowercase letters and whitespace only")); prints true , konfirmasi yen tembung all lowercase letters and whitespace only mung ngemot spasi lan aksara cilik. |
Pisah teks
Umume pangembang duwe paling ora sapisan kode ditulis kanggo mecah teks input dadi bagean komponen, kayata ngowahi akun karyawan adhedhasar teks dadi sakumpulan kolom. Kelas kasebutPattern
nyedhiyakake kemampuan kanggo ngatasi tugas sing angel iki kanthi luwih gampang nggunakake rong cara pamisah teks:
-
Cara
String[] split(CharSequence text, int limit)
pamisahtext
miturut sing ditemokake cocog karo pola obyekPattern
lan ngasilake asil ing array. Saben unsur array nemtokake urutan teks sing dipisahake saka urutan sabanjure kanthi fragmen teks sing cocog karo pola (utawa pungkasan teks). Unsur-unsur array ing urutan sing padha katon ingtext
.Ing metode iki, jumlah unsur array gumantung ing parameter
limit
, sing uga ngontrol jumlah sing cocog sing bisa ditemokake.- Nilai positif nggoleki ora luwih saka
limit-1
sing cocog lan dawane array ora luwih sakalimit
unsur. - Yen nilai negatif, kabeh cocog sing bisa digoleki, lan dawa array bisa kasepakatan.
- Yen nilai nol, kabeh bisa cocog bakal digoleki, dawa array bisa kasepakatan, lan garis kosong ing mburi dibuwak.
- Nilai positif nggoleki ora luwih saka
- Cara kasebut
String[] split(CharSequence text)
nelpon cara sadurunge kanthi 0 minangka argumen watesan lan ngasilake asil telpon kasebut.
split(CharSequence text)
kanggo ngrampungake masalah pamisah akun karyawan menyang lapangan sing kapisah saka jeneng, umur, alamat pos lan gaji:
Pattern p = Pattern.compile(",\\s");
String[] fields = p.split("John Doe, 47, Hillsboro Road, 32000");
for (int i = 0; i < fields.length; i++)
System.out.println(fields[i]);
Kode ing ndhuwur nggambarake ekspresi reguler kanggo nemokake karakter koma sing langsung diterusake karo karakter spasi siji. Mangkene asil eksekusi:
John Doe
47
Hillsboro Road
32000
Predikat cithakan lan Streams API
Ing Jawa 8,Pattern
ana metode muncul ing kelas . Cara iki nggawe predikat (fungsi kanthi nilai boolean) sing digunakake kanggo cocog karo pola kasebut. Panggunaan metode iki ditampilake ing cuplikan kode ing ngisor iki: Predicate
asPredicate()
List progLangs = Arrays.asList("apl", "basic", "c", "c++", "c#", "cobol", "java", "javascript", "perl", "python", "scala");
Pattern p = Pattern.compile("^c");
progLangs.stream().filter(p.asPredicate()).forEach(System.out::println);
Kode iki nggawe dhaptar jeneng basa pamrograman, banjur nyusun pola kanggo nemokake kabeh jeneng sing diwiwiti karo huruf c
. Baris pungkasan kode ing ndhuwur ngleksanakake nampa stream serial data karo dhaftar iki minangka sumber. Nyetel panyaring nggunakake fungsi Boolean asPredicate()
sing ngasilake bener nalika jeneng kasebut diwiwiti kanthi huruf c
lan ngulang liwat stream, nyithak jeneng sing cocog karo output standar. Baris pungkasan iki padha karo loop reguler ing ngisor iki, sing dikenal saka aplikasi RegexDemo saka Part 1:
for (String progLang: progLangs)
if (p.matcher(progLang).find())
System.out.println(progLang);
Metode kelas matcher
Kayata saka kelasMatcher
njlèntrèhaké mekanisme kanggo nindakake operasi pencocokan pola ing urutan karakter kanthi interpretasi ekspresi reguler kompilasi kelas Pattern
. Obyek kelas Matcher
ndhukung macem-macem jinis operasi telusuran pola:
-
Cara
boolean find()
nggoleki teks input kanggo pertandhingan sabanjure. Cara iki wiwit mindhai ing awal teks sing ditemtokake utawa ing karakter pisanan sawise pertandhingan sadurunge. Opsi kapindho mung bisa ditindakake yen telpon sadurunge kanggo metode iki bali bener lan solver ora direset. Ing kasus apa wae, yen telusuran sukses, nilai boolean bener bakal bali. Conto cara iki bisa ditemokake ingRegexDemo
Part 1. -
Cara kasebut
boolean find(int start)
ngreset matcher lan nggoleki teks kanggo match sabanjure. Ndeleng diwiwiti saka posisi sing ditemtokake dening parameterstart
. Yen telusuran sukses, nilai boolean bener bakal bali. Contone,m.find(1);
mindai teks wiwit saka posisi1
(posisi 0 ora digatekake). Yen parameterstart
ngandhut nilai negatif utawa nilai luwih saka dawa teks matcher, cara mbalang pangecualianjava.lang.IndexOutOfBoundsException
. -
Cara kasebut
boolean matches()
nyoba cocog kabeh teks menyang pola. Iki ngasilake nilai boolean sing bener yen kabeh teks cocog karo pola kasebut. Contone, kode kasebutPattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.matches());
metufalse
amarga karakter kasebut!
dudu karakter tembung. -
Cara kasebut
boolean lookingAt()
nyoba cocog karo teks sing ditemtokake karo pola. Cara iki ngasilake bener yen ana bagean teks sing cocog karo pola kasebut. Ora kaya metodematches();
, kabeh teks ora kudu cocog karo pola kasebut. Contone,Pattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.lookingAt());
bakal outputtrue
, wiwit awal teksabc!
mung kasusun saka tembung-mbentuk karakter.
Pattern
, obyek kelas Matcher
nahan informasi negara. Kadhangkala sampeyan kudu ngreset matcher kanggo mbusak informasi iki sawise panelusuran pola wis rampung. Cara ing ngisor iki kasedhiya kanggo ngreset solver:
-
Cara
Matcher reset()
ngreset kahanan matcher, kalebu posisi sing bakal ditambahake menyang mburi (reset menyang 0). Operasi telusuran pola sabanjure diwiwiti ing wiwitan teks matcher. Ngasilake referensi menyang obyek saikiMatcher
. Contone,m.reset();
ngreset solver sing dirujuk deningm
. -
Cara kasebut
Matcher reset(CharSequence text)
ngreset status solver lan nyetel teks solver anyar daditext
. Operasi telusuran pola sabanjure diwiwiti ing wiwitan teks matcher anyar. Ngasilake referensi menyang obyek saikiMatcher
. Contone,m.reset("new text");
ngreset solver sing dirujukm
lan nyetel teks solver anyar menyang"new text"
.
Nambahake teks nganti pungkasan
Posisi matcher sing bakal ditambahake ing pungkasan nemtokake wiwitan teks matcher sing ditambahake ing pungkasan obyek saka jinisjava.lang.StringBuffer
. Cara ing ngisor iki nggunakake posisi iki:
-
Cara kasebut
Matcher appendReplacement(StringBuffer sb, String replacement)
maca karakter teks matcher lan ditambahake ing pungkasan obyekStringBuffer
sing dirujuk dening argumensb
. Cara iki mandheg maca ing karakter pungkasan sadurunge cocog pola sadurunge. Sabanjure, cara kasebut nambahake karakter saka obyek saka jinisString
sing dirujuk dening argumenreplacement
menyang mburi obyekStringBuffer
(senar kasebutreplacement
bisa ngemot referensi kanggo urutan teks sing dijupuk sajrone panelusuran sadurunge; iki ditemtokake nggunakake karakter($)
lan nomer grup sing dijupuk). Akhire, cara nyetel Nilai saka posisi matcher kanggo appended menyang posisi karakter cocog pungkasan plus siji, lan banjur bali referensi kanggo matcher saiki. -
Cara kasebut
StringBuffer appendTail(StringBuffer sb)
nambahake kabeh teks menyang obyekStringBuffer
lan ngasilake referensi kanggo obyek kasebut. Sawise nelpon metode pungkasanappendReplacement(StringBuffer sb, String replacement)
, nelpon metodeappendTail(StringBuffer sb)
kanggo nyalin teks sing isih ana menyang obyekStringBuffer
.
Cara kasebut Matcher appendReplacement(StringBuffer sb, String replacement)
mbuwang pangecualian java.lang.IllegalStateException
yen matcher durung nemokake sing cocog utawa upaya telusuran sadurunge gagal. Mbuwang pangecualian IndexOutOfBoundsException
yen baris kasebut replacement
nemtokake klompok panangkepan sing ora ana ing pola kasebut).
Klompok sing dijupuk |
---|
Nalika sampeyan ngelingi saka Part 1, grup panangkepan minangka urutan karakter sing dilebokake ing kurung ( () ) metakarakter. Tujuan saka konstruksi iki yaiku kanggo nyimpen karakter sing ditemokake kanggo digunakake maneh nalika cocog pola. Kabeh karakter saka grup sing dijupuk dianggep minangka sakabehe sajrone panelusuran pola. |
appendReplacement(StringBuffer sb, String replacement)
lan cara appendTail(StringBuffer sb
kanggo ngganti kabeh kedadeyan saka urutan karakter ing teks sumber cat
karo caterpillar
:
Pattern p = Pattern.compile("(cat)");
Matcher m = p.matcher("one cat, two cats, or three cats on a fence");
StringBuffer sb = new StringBuffer();
while (m.find())
m.appendReplacement(sb, "$1erpillar");
m.appendTail(sb);
System.out.println(sb);
Nggunakake grup dijupuk lan referensi ing teks panggantos ngandhani program kanggo masang erpillar
sawise saben kedadean saka cat
. Asil saka eksekusi kode iki katon kaya iki: one caterpillar, two caterpillars, or three caterpillars on a fence
Ngganti teks
Kelas kasebutMatcher
menehi rong cara kanggo ngganti teks, pelengkap kanggo appendReplacement(StringBuffer sb, String replacement)
. Nggunakake metode iki, sampeyan bisa ngganti salah siji kedadeyan pisanan saka [teks sing diganti] utawa kabeh kedadeyan:
-
Cara
String replaceFirst(String replacement)
ngreset matcher, nggawe obyek anyarString
, nyalin kabeh karakter teks matcher (nganti pertandhingan pisanan) menyang string iki, nambah karakter saka pungkasanreplacement
, nyalin karakter sing isih ana menyang string lan ngasilake obyekString
(senar kasebutreplacement
bisa ngemot referensi kanggo sing dijupuk sajrone urutan teks telusuran sadurunge nggunakake simbol dolar lan nomer grup sing dijupuk). -
Cara iki
String replaceAll(String replacement)
makaryakke padha karo caraString replaceFirst(String replacement)
, nanging nggantireplacement
kabeh sing ditemokake cocog karo karakter saka senar.
\s+
nggoleki siji utawa luwih karakter spasi putih ing teks input. Ing ngisor iki, kita bakal nggunakake ekspresi reguler iki lan nelpon cara replaceAll(String replacement)
kanggo mbusak spasi duplikat:
Pattern p = Pattern.compile("\\s+");
Matcher m = p.matcher("Удаляем \t\t лишние пробелы. ");
System.out.println(m.replaceAll(" "));
Mangkene asile: Удаляем лишние пробелы.
Ungkapan Reguler ing Basa Jawa, Perangan 4 Ekspresi Reguler ing Basa Jawa, Perangan 5
GO TO FULL VERSION