We presentake kanggo manungsa waé terjemahan saka pandhuan singkat kanggo ekspresi reguler ing Jawa, ditulis dening Jeff Friesen kanggo situs web
javaworld . Kanggo gampang maca, kita wis dibagi artikel dadi sawetara bagean.
Ungkapan Biasa ing Basa Jawa, Part 1
Nggabungake sawetara kisaran |
Sampeyan bisa nggabungake pirang-pirang kisaran menyang kelas karakter kisaran siji kanthi nyelehake ing sisih. Contone, kelas kasebut [a-zA-Z] cocog karo kabeh karakter alfabet Latin ing huruf cilik utawa gedhe. |
Nggabungake sawetara kisaran
Sampeyan bisa nggabungake pirang-pirang kisaran menyang kelas karakter kisaran siji kanthi nyelehake ing sisih. Contone, kelas kasebut
[a-zA-Z]
cocog karo kabeh karakter alfabet Latin ing huruf cilik utawa gedhe.
Nggabungake Kelas Karakter
Uni kelas karakter kasusun saka sawetara kelas karakter nested lan cocog kabeh karakter ing serikat asil. Contone, kelas
[a-d[m-p]]
cocog karakter saka
a
menyang
d
lan saka
m
kanggo
p
. Coba conto ing ngisor iki:
java RegexDemo [ab[c-e]] abcdef
Conto iki bakal nemokake karakter
a
,
b
,
c
,
d
lan
e
, sing ana sing cocog ing
abcdef
:
regex = [ab[c-e]]
input = abcdef
Found [a] starting at 0 and ending at 0
Found [b] starting at 1 and ending at 1
Found [c] starting at 2 and ending at 2
Found [d] starting at 3 and ending at 3
Found [e] starting at 4 and ending at 4
Persimpangan kelas karakter
Persimpangan kelas karakter kasusun saka karakter umum kanggo kabeh kelas nested lan cocog mung karakter umum. Contone, kelas
[a-z&&[d-f]]
cocog karakter
d
,
e
lan
f
. Coba conto ing ngisor iki:
java RegexDemo "[aeiouy&&[y]]" party
Elinga yen ing sistem operasi Windows, kuotasi pindho dibutuhake amarga cangkang printah dianggep
&
minangka pemisah printah. Conto iki mung bakal nemokake karakter
y
sing cocog ing
party
:
regex = [aeiouy&&[y]]
input = party
Found [y] starting at 4 and ending at 4
Ngurangi kelas karakter
Kelas karakter subtracting kasusun saka kabeh karakter kajaba sing ana ing kelas karakter nested, lan cocog mung karakter isih. Contone, kelas
[a-z&&[^m-p]]
cocog karakter saka
a
menyang
l
lan saka
q
kanggo
z
:
java RegexDemo "[a-f&&[^a-c]&&[^e]]" abcdefg
Conto iki bakal nemokake karakter
d
lan
f
sing ana cocog ing
abcdefg
:
regex = [a-f&&[^a-c]&&[^e]]
input = abcdefg
Found [d] starting at 3 and ending at 3
Found [f] starting at 5 and ending at 5
Kelas Karakter sing wis ditemtokake
Sawetara kelas karakter katon cukup kerep ing
ekspresi reguler kanggo mbenerake panggunaan notasi shorthand. Kelas kasebut
Pattern
nawakake kelas karakter sing wis ditemtokake minangka singkatan kasebut. Sampeyan bisa nggunakake kanggo nyederhanakake ekspresi reguler lan nyilikake kesalahan sintaksis. Ana sawetara kategori kelas karakter sing wis ditemtokake: standar, POSIX,
java.lang.Character
lan sifat Unicode kayata skrip, blok, kategori, lan biner. Dhaptar ing ngisor iki mung nuduhake kategori kelas standar:
\d
: Nomer. setara [0-9]
.
\D
: Karakter non-numerik. setara [^0-9]
.
\s
: Karakter spasi putih. setara [ \t\n\x0B\f\r]
.
\S
: Ora karakter spasi putih. setara [^\s]
.
\w
: Simbol wujud tembung. setara [a-zA-Z_0-9]
.
\W
: Ora watake gawe tembung. setara [^\w]
.
Conto ing ngisor iki nggunakake kelas karakter sing wis ditemtokake
\w
kanggo njlèntrèhaké kabeh karakter tembung ing teks input:
java RegexDemo \w "aZ.8 _"
Deleng kanthi teliti asil eksekusi ing ngisor iki, sing nuduhake yen karakter titik lan spasi ora dianggep minangka karakter tembung:
regex = \w
input = aZ.8 _
Found [a] starting at 0 and ending at 0
Found [Z] starting at 1 and ending at 1
Found [8] starting at 3 and ending at 3
Found [_] starting at 5 and ending at 5
Pemisah garis |
Dokumentasi SDK kelas Pattern nggambarake metakarakter titik minangka kelas karakter sing wis ditemtokake sing cocog karo karakter apa wae kajaba pemisah baris (urutan siji utawa rong karakter sing menehi tandha pungkasan baris). Pangecualian yaiku mode dotall (sing bakal dibahas sabanjure), ing ngendi titik uga cocog karo pemisah garis. Kelas Pattern mbedakake pemisah baris ing ngisor iki:
- karakter bali kreta (
\r );
- karakter baris anyar (simbol kanggo maju kertas siji baris) (
\n );
- karakter bali gerbong langsung disusul karakter baris anyar (
\r\n );
- karakter baris sabanjure (
\u0085 );
- karakter pemisah baris (
\u2028 );
- simbol pemisah paragraf (
\u2029 )
|
Klompok sing dijupuk
Klompok panangkepan digunakake kanggo nyimpen set karakter sing ditemokake supaya bisa digunakake maneh nalika nggoleki miturut pola. Konstruksi iki minangka urutan karakter sing diapit ing metakarakter kanthi tanda kurung (
( )
). Kabeh karakter ing grup sing dijupuk dianggep minangka wutuh nalika nggoleki miturut pola. Contone, grup panangkepan (
Java
) nggabungake huruf
J
,
a
,
v
lan
a
dadi unit siji. Klompok panangkepan iki nemokake kabeh kedadeyan pola
Java
ing teks input. Kanthi saben pertandhingan, karakter sing disimpen sadurunge
Java
diganti karo sing sabanjure. Klompok sing dijupuk bisa disarang ing grup sing dijupuk liyane. Contone, ing ekspresi reguler,
(Java( language))
grup
(language)
dipasang ing grup
(Java)
. Saben klompok jupuk nested utawa non-nested diwenehi nomer, wiwit saka 1, lan nomer saka kiwa menyang tengen. Ing conto sadurunge,
(Java( language))
cocog njupuk grup nomer 1 lan
(language)
cocog dijupuk grup nomer 2. Ing expression biasa
(a)(b)
,
(a)
cocog dijupuk grup nomer 1 lan
(b)
dijupuk grup nomer 2.
Cocokake disimpen dening dijupuk grup bisa mengko diakses nggunakake backreferences. Ditemtokake minangka karakter backslash ngiring dening karakter numerik cocog kanggo nomer klompok dijupuk, backreference ngijini sampeyan kanggo deleng karakter ing teks dijupuk dening grup. Duwe backlink nyebabake matcher ngrujuk menyang asil panelusuran sing disimpen klompok sing dijupuk adhedhasar nomer kasebut, banjur gunakake karakter saka asil kasebut kanggo nyoba nggoleki luwih lanjut. Conto ing ngisor iki nuduhake panggunaan backreference kanggo nemokake kesalahan gramatikal ing teks:
java RegexDemo "(Java( language)\2)" "The Java language language"
Conto iki
(Java( language)\2)
nggunakake ekspresi reguler kanggo nemokake kesalahan gramatikal kanthi tembung duplikat
language
langsung
Java
ing teks input
"The Java language language"
. Ekspresi reguler iki nemtokake rong klompok kanggo dijupuk: nomer 1 –
(Java( language)\2)
, cocog karo
Java language language
lan nomer 2 –
(language)
, cocog karo karakter spasi ngiring dening
language
. Referensi mburi
\2
ngidini asil sing disimpen saka grup nomer 2 bisa dideleng maneh supaya sing cocog bisa nggoleki kedadeyan kapindho spasi sing diikuti dening
language
, sanalika sawise kedadeyan pisanan spasi lan
language
. Asil saka matcher
RegexDemo
kaya ing ngisor iki:
regex = (Java( language)\2)
input = The Java language language
Found [Java language language] starting at 4 and ending at 25
Tandha wates
Kadhangkala sampeyan kudu nindakake pertandhingan pola ing wiwitan baris, ing wates tembung, ing pungkasan teks, lsp. Sampeyan bisa nindakake iki kanthi nggunakake salah siji saka matcher pinggiran kelas
Pattern
, yaiku konstruksi ekspresi reguler sing nggoleki sing cocog ing lokasi ing ngisor iki:
^
: Wiwitan baris;
$
: Pungkasan baris;
\b
: Watesan tembung;
\B
: Watesan tembung pseudo;
\A
: Wiwitan teks;
\G
: Pungkasan pertandhingan sadurunge;
\Z
: Pungkasan teks, ora ngetung pemisah baris pungkasan (yen ana);
\z
: Pungkasan teks
Conto ing ngisor iki nggunakake
^
metacharacter matcher wates kanggo nemokake garis sing diwiwiti karo
The
, ngiring dening karakter tembung nol utawa luwih:
java RegexDemo "^The\w*" Therefore
Karakter kasebut
^
nemtokake yen telung karakter pisanan teks input kudu cocog karo karakter pola consecutive
T
,
h
lan
e
, kang bisa ngiring dening sembarang nomer. saka simbol-simbol mbentuk tembung. Punika asil eksekusi:
regex = ^The\w*
input = Therefore
Found [Therefore] starting at 0 and ending at 8
Apa sing kedadeyan yen sampeyan ngganti baris perintah dadi
java RegexDemo "^The\w*" " Therefore"
? Ora ana sing cocog bakal ditemokake amarga
Therefore
teks input didhisiki dening karakter spasi.
Nul dawa cocog
Kadhangkala, nalika nggarap pencocokan pinggiran, sampeyan bakal nemoni pertandhingan dawa nol.
Совпадение нулевой длины
yaiku tetandhingan kang ora ngemot aksara. Bisa kedadeyan ing teks input kosong, ing wiwitan teks input, sawise karakter pungkasan teks input, lan ing antarane rong karakter teks input. Pertandhingan sing dawane nol gampang dingerteni amarga mesthi diwiwiti lan diakhiri ing posisi sing padha. Coba conto ing ngisor iki:
java RegExDemo \b\b "Java is"
Conto iki nggoleki rong wates tembung sing berturut-turut, lan asile katon kaya iki:
regex = \b\b
input = Java is
Found [] starting at 0 and ending at -1
Found [] starting at 4 and ending at 3
Found [] starting at 5 and ending at 4
Found [] starting at 7 and ending at 6
Kita ndeleng sawetara pertandhingan dawa nol ing asil. Posisi pungkasan ing kene kurang siji tinimbang posisi wiwitan, amarga
RegexDemo
aku nemtokake kode sumber ing Listing 1
end() – 1
.
Quantifiers
Quantifier minangka konstruksi ekspresi reguler sing sacara eksplisit utawa implisit nggandhengake pola karo nilai numerik. Nilai numerik iki nemtokake kaping pirang-pirang nggoleki pola kasebut. Quantifiers dipérang dadi rakus, kesed lan super rakus:
- Pengukur rakus (
?
, *
utawa +
) dirancang kanggo nemokake match paling dawa. Aku bisa takon X
? kanggo nemokake siji utawa kurang kedadeyan X
, X*
nemokake nol utawa luwih X
, X+
nemokake siji utawa luwih kedadeyan X
, X{n}
nemokake n
kedadeyan X
, X{n,}
nemokake paling sethithik (lan bisa uga luwih) n
kedadeyan , X
lan X{n,m}
nemokake paling sethithik n
nanging ora m
luwih X
.
- Kuantasi kesed (
??
, *?
utawa +?
) dirancang kanggo nemokake match paling cendhak. Sampeyan bisa nemtokake X??
kanggo nelusuri siji utawa kurang kedadeyan saka X
, X*
? kanggo nemokake nol utawa luwih kedadeyan X
, X+?
nemokake siji utawa luwih kedadeyan X
, X{n}?
nemokake n
kedadeyan X
, X{n,}?
nemokake paling ora (lan bisa uga luwih) n
kedadeyan X
, lan X{n,m}?
nemokake paling ora n
nanging ora luwih saka m
kedadeyan X
.
- Ukara super rakus (
?+
, *+
utawa ++
) padha karo panambang rakus, kajaba panambang super rakus mung ngupayakake siji-sijine nggolek tetandhingan sing paling dawa, dene panambang rakus bisa nindakake pirang-pirang usaha. Bisa disetel X?+
kanggo nemokake siji utawa kurang kedadeyan X
, X*+
kanggo nemokake nol utawa luwih kedadeyan X
, X++
kanggo nemokake siji utawa luwih kedadeyan X
, X{n}+
kanggo nemokake n
kedadeyan X
, X{n,}+
nemokake paling sethithik (lan bisa uga luwih) n
kedadeyan , X
lan X{n,m}+
nemokake paling ora n
nanging ora luwih saka m
kedadeyan . X
.
Conto ing ngisor iki nggambarake panggunaan kuantifier rakus:
java RegexDemo .*ox "fox box pox"
Iki asile:
regex = .*ox
input = fox box pox
Found [fox box pox] starting at 0 and ending at 10
Kuantifier rakus (
.*
) nemokake urutan paling dawa saka karakter pungkasan ing
ox
. Iku nganggo kabeh teks input banjur muter maneh nganti ndeteksi yen teks input rampung karo karakter iki. Coba saiki quantifier malas:
java RegexDemo .*?ox "fox box pox"
Asil:
regex = .*?ox
input = fox box pox
Found [fox] starting at 0 and ending at 2
Found [ box] starting at 3 and ending at 6
Found [ pox] starting at 7 and ending at 10
Kuantifikasi males (
.*?
) nemokake urutan karakter paling cendhak sing diakhiri karo
ox
. Diwiwiti nganggo senar kosong lan mboko sithik nganggo karakter nganti nemu sing cocog. Banjur terus digunakake nganti teks input kesel. Pungkasan, ayo goleki kuantitas super rakus:
java RegexDemo .*+ox "fox box pox"
Lan iki asile:
regex = .*+ox
input = fox box pox
Pengukuran ekstra rakus (
.*+
) ora nemokake sing cocog amarga nggunakake kabeh teks input lan ora ana sing bisa dicocogake
ox
ing pungkasan ekspresi reguler. Beda karo quantifier rakus, quantifier super rakus ora muter maneh.
Nul dawa cocog
Kadhangkala nalika nggarap quantifiers sampeyan bakal nemoni pertandhingan dawa nol. Contone, nggunakake kuantifier rakus ing ngisor iki ngasilake pirang-pirang pertandhingan dawa nol:
java RegexDemo a? abaa
Asil nglakokake conto iki:
regex = a?
input = abaa
Found [a] starting at 0 and ending at 0
Found [] starting at 1 and ending at 0
Found [a] starting at 2 and ending at 2
Found [a] starting at 3 and ending at 3
Found [] starting at 4 and ending at 3
Ana limang pertandhingan ing asil eksekusi. Senajan pisanan, katelu lan papat cukup samesthine (padha cocog karo posisi telung huruf
a
ing
abaa
), kaloro lan kaping lima bisa kaget sampeyan. Iku misale jek sing nuduhake apa
a
sing cocog
b
kanggo mburi teks, nanging ing kasunyatan iki ora. Ekspresi reguler
a?
ora nggoleki
b
ing pungkasan teks. Iku nggoleki ana utawa ora
a
. Nalika
a?
ora ketemu
a
, laporan minangka match nul-dawa.
Ekspresi gendera bersarang
Matchers nggawe sawetara asumsi standar sing bisa diganti nalika nyusun ekspresi reguler dadi pola. Kita bakal ngrembug masalah iki mengko. Ekspresi reguler ngidini sampeyan ngilangi standar apa wae kanthi nggunakake ekspresi gendera bersarang. Konstruksi ekspresi reguler iki ditemtokake minangka metakarakter kurung ing saubengé tandha pitakon metakarakter (
?
), diikuti karo aksara Latin cilik. Kelas
Pattern
ngerti ekspresi gendera bersarang ing ngisor iki:
(?i)
: Ngaktifake pencocokan pola cilik-sensitif. Contone, nalika nggunakake printah, java RegexDemo (?i)tree Treehouse
urutan karakter Tree
cocog pola tree
. Default yaiku telusuran pola sensitif huruf cilik.
(?x)
: Ngidini nggunakake karakter spasi putih lan komentar sing diwiwiti saka metacharacter ing pola kasebut #
. Matcher bakal nglirwakake loro. Contone, kanggo java RegexDemo ".at(?x)#match hat, cat, and so on" matter
urutan karakter mat
cocog pola .at
. Kanthi gawan, karakter spasi putih lan komentar ora diijini, lan matcher dianggep minangka karakter sing melu telusuran.
(?s)
: Mbisakake mode dotall, ing ngendi metakarakter titik cocog karo pemisah baris saliyane karakter liyane. Contone, printah java RegexDemo (?s). \n
bakal nemokake karakter baris anyar. Default iku ngelawan saka dotall: ora ana separator baris bakal ketemu. Contone, printah Java RegexDemo . \n
ora bakal nemokake karakter baris anyar.
(?m)
: Ngaktifake mode multiline, sing ^
cocog karo wiwitan lan $
pungkasan saben baris. Contone, java RegexDemo "(?m)^abc$" abc\nabc
nemokake loro urutan ing teks input abc
. Kanthi gawan, mode baris siji digunakake: ^
cocog karo wiwitan kabeh teks input, lan $
cocog karo pungkasane. Contone, java RegexDemo "^abc$" abc\nabc
ngasilake respon sing ora ana sing cocog.
(?u)
: Mbisakake alignment cilik sing sensitif Unicode. Gendéra iki, nalika digunakake bebarengan karo (?i)
, ngidini kanggo cocog pola cilik-sensitif miturut standar Unicode. Setelan gawan kanggo nggoleki karakter cilik-sensitif lan US-ASCII mung.
(?d)
: Mbisakake mode senar gaya Unix, ngendi matcher ngenali metacharacters ing konteks .
, ^
lan $
mung baris pamisah \n
. Default yaiku mode string gaya non-Unix: matcher ngenali, ing konteks metakarakter ing ndhuwur, kabeh pembatas baris.
Ekspresi gendera bersarang mirip grup sing dijupuk amarga karaktere diubengi dening metakarakter kurung. Ora kaya grup sing dijupuk, ekspresi gendera bersarang minangka conto grup sing ora dijupuk, sing minangka konstruksi ekspresi reguler sing ora njupuk karakter teks. Iki ditetepake minangka urutan karakter sing diubengi dening metakarakter saka kurung.
Nemtokake Multiple Nested Flag Expressions |
Sampeyan bisa nemtokake macem-macem ekspresi gendera bersarang ing ekspresi reguler kanthi nyelehake ing sisih ( (?m)(?i)) ) utawa nyelehake huruf sing nemtokake kanthi urutan ( (?mi) ). |
Kesimpulan
Kaya sing wis sampeyan ngerteni saiki, ekspresi reguler pancen migunani lan dadi luwih migunani nalika sampeyan nguwasani nuansa sintaksis. Nganti saiki aku wis ngenalake sampeyan babagan dhasar ekspresi reguler lan
Pattern
. Ing Part 2, kita bakal nliti luwih jero menyang Regex API lan njelajah metode
Pattern
,
Matcher
lan
PatternSyntaxException
. Aku uga bakal nuduhake sampeyan rong aplikasi praktis saka Regex API sing bisa langsung digunakake ing program sampeyan.
Ungkapan Biasa ing Basa Jawa, Bagian 3 Ungkapan Reguler ing Basa Jawa, Bagian 4 Ungkapan Reguler ing Basa Jawa, Bagian 5
Apa maneh sing kudu diwaca: |
|
GO TO FULL VERSION