Apa ekspresi reguler RegEx?
Nyatane, ekspresi reguler (RegEx ing Jawa) minangka pola kanggo nggoleki senar ing teks. Ing Jawa, perwakilan awal saka pola iki tansah string, yaiku, obyek saka kelas String. Nanging, ora ana senar sing bisa dikompilasi dadi ekspresi reguler, mung sing manut aturan nulis ekspresi reguler - sintaks sing ditetepake ing spesifikasi basa. Kanggo nulis ekspresi reguler, karakter alfabet lan angka digunakake, uga metacharacter - karakter sing nduweni makna khusus ing sintaks ekspresi reguler. Tuladhane:String regex = "java"; // string template "java";
String regex = "\\d{3}"; // string template of three numeric characters;
Nggawe Ekspresi Reguler ing Jawa
Kanggo nggawe RegEx ing Jawa, sampeyan kudu tindakake rong langkah prasaja:- nulis minangka string nggunakake sintaks ekspresi reguler;
- ngumpulake senar iki dadi ekspresi biasa;
Pattern
. Kanggo nindakake iki, sampeyan kudu nelpon salah siji saka rong cara statis kasedhiya ing kelas compile
. Cara pisanan njupuk siji argumen - string literal saka ekspresi reguler, lan liya - ditambah parameter liyane sing nguripake mode kanggo mbandhingake cithakan karo teks:
public static Pattern compile (String literal)
public static Pattern compile (String literal, int flags)
Dhaptar nilai parameter sing bisa flags
ditemtokake ing kelas Pattern
lan kasedhiya kanggo kita minangka variabel kelas statis. Tuladhane:
Pattern pattern = Pattern.compile("java", Pattern.CASE_INSENSITIVE);//searching for matches with the pattern will be done case-insensitively.
Ateges, kelas Pattern
minangka konstruktor ekspresi reguler. Ing hood, cara compile
nelpon konstruktor pribadi kelas Pattern
kanggo nggawe tampilan nyawiji. Cara nggawe conto cithakan iki ditindakake kanthi tujuan nggawe minangka obyek sing ora bisa diganti. Nalika nggawe, mriksa sintaks ekspresi reguler ditindakake. Yen ana kesalahan ing baris, pangecualian digawe PatternSyntaxException
.
Sintaks ekspresi reguler
Sintaksis ekspresi reguler adhedhasar panggunaan simbol<([{\^-=$!|]})?*+.>
, sing bisa digabung karo karakter alfabet. Gumantung ing peran, bisa dipérang dadi sawetara klompok:
Metakarakter | tujuane |
---|---|
^ | wiwitan baris |
$ | mburi baris |
\b | wates tembung |
\B | ora watesan tembung |
\A | wiwitan input |
\G | pungkasan pertandhingan sadurunge |
\Z | pungkasan input |
\z | pungkasan input |
Metakarakter | tujuane |
---|---|
\d | simbol digital |
\D | karakter non-numerik |
\s | karakter spasi |
\S | karakter non-whitespace |
\w | karakter alfanumerik utawa garis ngisor |
\W | karakter apa wae kajaba abjad, angka, utawa garis ngisor |
. | karakter apa wae |
Metakarakter | tujuane |
---|---|
\t | karakter tab |
\n | karakter baris anyar |
\r | karakter bali gerbong |
\f | pindhah menyang kaca anyar |
\u0085 | karakter baris sabanjuré |
\u 2028 | karakter pamisah baris |
\u 2029 | simbol pamisah paragraf |
Metakarakter | tujuane |
---|---|
[a B C] | samubarang ing ndhuwur (a, b, utawa c) |
[^abc] | liyane saka sing kadhaptar (ora a, b, c) |
[a-zA-Z] | penggabungan jangkauan (karakter Latin a nganti z ora sensitif huruf cilik) |
[iklan [mp]] | gabungan aksara (a nganti d lan m nganti p) |
[az&&[def]] | persimpangan simbol (simbol d,e,f) |
[az&&[^bc]] | nyuda karakter (karakter a, dz) |
Metakarakter | tujuane |
---|---|
? | siji utawa ilang |
* | nul utawa luwih kaping |
+ | siji utawa luwih |
{n} | n kaping |
{n,} | n kaping utawa luwih |
{n,m} | ora kurang saka n kaping lan ora luwih saka m kaping |
Mode pengukur rakus
Fitur khusus saka quantifier yaiku kemampuan kanggo nggunakake ing macem-macem mode: rakus, super rakus lan kesed. Mode ekstra rakus diuripake kanthi nambahake simbol "+
" sawise pengukur, lan mode kesed kanthi nambahake simbol " ?
". Tuladhane:
"A.+a" // greedy mode
"A.++a" // over-greedy mode
"A.+?a" // lazy mode
Nggunakake cithakan iki minangka conto, ayo nyoba kanggo mangerteni carane quantifiers bisa ing macem-macem mode. Kanthi gawan, quantifier beroperasi ing mode rakus. Iki tegese iku katon kanggo match paling dawa ing senar. Minangka asil mbukak kode iki:
public static void main(String[] args) {
String text = "Egor Alla Alexander";
Pattern pattern = Pattern.compile("A.+a");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println(text.substring(matcher.start(), matcher.end()));
}
}
kita bakal entuk output ing ngisor iki: Alla Alexa Algoritma telusuran kanggo pola tartamtu " А.+а
" ditindakake kanthi urutan ing ngisor iki:
-
Ing pola sing diwenehake, karakter pisanan yaiku karakter huruf Rusia
А
.Matcher
cocog karo saben karakter teks, wiwit saka posisi nol. Ing posisi nol ing teks kita ana simbolЕ
, supayaMatcher
liwat karakter ing teks sequentially nganti ketemu cocog karo pola. Ing conto kita, iki minangka simbol ing posisi No. -
Sawise cocog ditemokake karo karakter pisanan saka pola,
Matcher
mriksa cocog karo karakter kapindho pola. Ing kasus kita, iki minangka simbol ".
", sing tegese karakter apa wae.Ing posisi kaping enem ana simbol huruf
л
. Mesthine, cocog karo pola "karakter apa wae". -
Matcher
pindhah menyang mriksa karakter sabanjuré saka pola. Ing cithakan kita, ditemtokake nggunakake.+
kuantifier "". Wiwit jumlah repetisi saka "karakter apa wae" ing pola kasebut kaping siji utawa luwih,Matcher
mula karakter sabanjure dijupuk saka senar kasebut lan mriksa manawa tundhuk karo pola kasebut, anggere kondisi "karakter apa wae" ditemokake, ing conto kita - nganti pungkasan baris (saka posisi No. 7 - No. 18 teks).Nyatane,
Matcher
iku njupuk kabeh baris kanggo mburi - iki ngendi "rakus" manifests dhewe. -
Sawise
Matcher
tekan pungkasan teks lan rampung mriksa bagean "А.+
" saka pola, Matcher wiwit mriksa pola liyane - karakter hurufа
. Wiwit teks ing arah maju wis rampung, mriksa ana ing arah mbalikke, wiwit saka karakter pungkasan: -
Matcher
"ngelingi" jumlah repetisi ing pola ".+
" sing wis tekan pungkasan teks, mula ngurangi jumlah repetisi siji lan mriksa pola teks nganti ketemu sing cocog:
Mode quantifier ultra-rakus
Ing mode super-rakus, matcher dianggo padha karo mekanisme mode rakus. Bentenipun punika nalika sampeyan njupuk teks kanggo mburi baris, ora ana panelusuran mundur. Yaiku, telung tahap pisanan ing mode super-rakus bakal padha karo mode rakus. Sawise njupuk kabeh senar, matcher nambahake pola liyane lan mbandhingake karo senar sing dijupuk. Ing conto kita, nalika nglakokake metode utama kanthi pola "А.++а
", ora bakal ditemokake sing cocog.
Mode quantifier malas
-
Ing mode iki, ing tahap wiwitan, kaya ing mode rakus, pertandhingan digoleki kanthi karakter pisanan saka pola kasebut:
-
Sabanjure, goleki sing cocog karo karakter sabanjure ing pola - karakter apa wae:
-
Beda karo mode rakus, mode lazy nggoleki sing cocog paling cendhak ing teks, mula sawise nemokake sing cocog karo karakter kapindho pola kasebut, sing ditemtokake dening titik lan cocog karo karakter ing posisi nomer 6 teks kasebut,
Matcher
bakal mriksa yen teks cocog karo pola liyane - karakter "а
" . -
Wiwit cocog karo pola ing teks ora ditemokake (ing posisi No. 7 ing teks ana simbol "
л
"),Matcher
nambah "karakter apa wae" liyane ing pola kasebut, amarga ditetepake minangka siji utawa luwih. lan maneh mbandhingake pola karo teks ing posisi karo No. 5 kanggo No. 8: -
Ing kasus kita, match ditemokake, nanging pungkasan teks durung tekan. Mulane, saka posisi No.
main
nalika nggunakake А.+?а
cithakan " ", kita bakal entuk asil ing ngisor iki: Alla Alexa Minangka bisa katon saka conto kita, nalika nggunakake mode quantifier beda kanggo cithakan padha, kita entuk asil beda. Mulane, perlu kanggo njupuk fitur iki lan pilih mode sing dikarepake gumantung saka asil sing dikarepake sajrone panelusuran.
Uwal karakter ing ekspresi biasa
Wiwit ekspresi reguler ing Jawa, utawa luwih tepat perwakilan wiwitane, ditemtokake nggunakake string literal, perlu kanggo njupuk menyang akun aturan specification Jawa sing ana hubungane karo string literals. Utamane, karakter backslash "\
" ing string literals ing kode sumber Jawa diinterpretasikake minangka karakter uwal sing menehi tandha marang kompilator yen karakter sing ana ing ngisor iki minangka karakter khusus lan kudu diinterpretasikake kanthi cara khusus. Tuladhane:
String s = "The root directory is \nWindows";//wrap Windows to a new line
String s = "The root directory is \u00A7Windows";//insert paragraph character before Windows
Mulane, ing string literals sing njlèntrèhaké ekspresi reguler lan nggunakake \
karakter " " (contone, kanggo metacharacters), iku kudu pindho supaya compiler bytecode Jawa ora interpretasi beda. Tuladhane:
String regex = "\\s"; // template for searching for space characters
String regex = "\"Windows\""; // pattern to search for the string "Windows"
Karakter backslash ganda uga kudu digunakake kanggo uwal karakter khusus yen kita rencana nggunakake minangka karakter "biasa". Tuladhane:
String regex = "How\\?"; // template for searching the string "How?"
Metode saka kelas Pola
Kelas kasebutPattern
nduweni cara liya kanggo nggarap ekspresi reguler: String pattern()
- ngasilake perwakilan string asli saka ekspresi reguler saka ngendi obyek kasebut digawe Pattern
:
Pattern pattern = Pattern.compile("abc");
System.out.println(Pattern.pattern())//"abc"
static boolean matches(String regex, CharSequence input)
– ngijini sampeyan kanggo mriksa ekspresi reguler liwati ing parameter regex marang teks liwati ing parameter input
. Ngasilake: bener - yen teks cocog karo pola; palsu - digunakake; Tuladha:
System.out.println(Pattern.matches("A.+a","Alla"));//true
System.out.println(Pattern.matches("A.+a","Egor Alla Alexander"));//false
int flags()
- ngasilake flags
nilai parameter template sing disetel nalika digawe, utawa 0 yen parameter iki ora disetel. Tuladha:
Pattern pattern = Pattern.compile("abc");
System.out.println(pattern.flags());// 0
Pattern pattern = Pattern.compile("abc",Pattern.CASE_INSENSITIVE);
System.out.println(pattern.flags());// 2
String[] split(CharSequence text, int limit)
– pamisah teks liwati minangka parameter menyang larik saka unsur String
. Parameter limit
nemtokake jumlah maksimum sing cocog sing digoleki ing teks:
- nalika
limit>0
- nelusurilimit-1
pertandhingan ditindakake; - ing
limit<0
– nelusuri kabeh cocog ing teks - nalika
limit=0
– nelusuri kabeh cocog ing teks, nalika baris kosong ing mburi Uploaded dibuwak;
public static void main(String[] args) {
String text = "Egor Alla Anna";
Pattern pattern = Pattern.compile("\\s");
String[] strings = pattern.split(text,2);
for (String s : strings) {
System.out.println(s);
}
System.out.println("---------");
String[] strings1 = pattern.split(text);
for (String s : strings1) {
System.out.println(s);
}
}
Output konsol: Egor Alla Anna -------- Egor Alla Anna Kita bakal nimbang cara kelas liyane kanggo nggawe obyek Matcher
ing ngisor iki.
Metode kelas matcher
Matcher
yaiku kelas saka ngendi obyek digawe kanggo nggoleki pola. Matcher
- iki minangka "mesin telusur", "mesin" saka ekspresi reguler. Kanggo nggoleki, dheweke kudu diwenehi rong perkara: pola telusuran lan "alamat" kanggo nggoleki. Kanggo nggawe obyek, Matcher
cara ing ngisor iki diwenehake ing kelas Pattern
: рublic Matcher matcher(CharSequence input)
Minangka argumen, metode kasebut njupuk urutan karakter sing bakal ditindakake telusuran. Iki minangka obyek saka kelas sing ngetrapake antarmuka CharSequence
. String
Sampeyan bisa pass ora mung , nanging uga StringBuffer
, StringBuilder
, Segment
lan minangka argumentasi CharBuffer
. Cithakan telusuran minangka obyek kelas Pattern
sing diarani metode kasebut matcher
. Tuladha nggawe matcher:
Pattern p = Pattern.compile("a*b");// compiled the regular expression into a view
Matcher m = p.matcher("aaaaab");//created a search engine in the text “aaaaab” using the pattern "a*b"
Saiki, kanthi bantuan "mesin telusuran," kita bisa nggoleki sing cocog, ngerteni posisi sing cocog ing teks, lan ngganti teks nggunakake metode kelas. Cara kasebut boolean find()
nggoleki pertandhingan sabanjure ing teks kanthi pola. Nggunakake metode iki lan operator daur ulang, sampeyan bisa nganalisa kabeh teks miturut model acara (nglakokake operasi sing dibutuhake nalika ana acara - nemokake sing cocog ing teks). Contone, nggunakake cara saka kelas iki, int start()
sampeyan int end()
bisa nemtokake posisi match ing teks, lan nggunakake cara String replaceFirst(String replacement)
, String replaceAll(String replacement)
ngganti cocog ing teks karo teks panggantos liyane. Tuladha:
public static void main(String[] args) {
String text = "Egor Alla Anna";
Pattern pattern = Pattern.compile("A.+?a");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
int start=matcher.start();
int end=matcher.end();
System.out.println("Match found" + text.substring(start,end) + " с "+ start + " By " + (end-1) + "position");
}
System.out.println(matcher.replaceFirst("Ira"));
System.out.println(matcher.replaceAll("Olga"));
System.out.println(text);
}
Output program: A match ditemokake Alla saka 5 kanggo 8 posisi A match ditemokake Anna saka 10 kanggo 13 posisi Egor Ira Anna Egor Olga Olga Egor Alla Anna Saka conto iku cetha yen cara replaceFirst
nggawe replaceAll
obyek anyar String
- senar, kang yaiku teks sumber sing cocog karo cithakan diganti karo teks sing dikirim menyang metode minangka argumen. Menapa malih, cara replaceFirst
ngganti mung match pisanan, lan replaceAll
kabeh cocog ing test. Teks asli tetep ora owah. Panganggone metode kelas liyane Matcher
, uga conto ekspresi reguler, bisa ditemokake ing seri artikel iki . Operasi sing paling umum nganggo ekspresi reguler nalika nggarap teks yaiku saka kelas Pattern
lan Matcher
dibangun ing String
. Iki minangka cara kayata split
, matches
, replaceFirst
, replaceAll
. Nanging nyatane, "ing hood" padha nggunakake Pattern
lan Matcher
. Dadi, yen sampeyan kudu ngganti teks utawa mbandhingake senar ing program tanpa nulis kode sing ora perlu, gunakake metode String
. Yen sampeyan butuh kemampuan sing luwih maju, pikirake babagan kelas Pattern
lan Matcher
.
Kesimpulan
Ekspresi biasa diterangake ing program Jawa nggunakake strings sing cocog pola ditetepake dening aturan. Nalika kode mbukak, Jawa recompiles string iki menyang obyek kelasPattern
lan nggunakake obyek kelas Matcher
kanggo nemokake cocog ing teks. Kaya sing dakkandhakake ing wiwitan, ekspresi biasa asring disisihake kanggo mengko, dianggep minangka topik sing angel. Nanging, yen sampeyan ngerti dhasar sintaksis, metakarakter, mlayu, lan nyinaoni conto ekspresi reguler, mula luwih gampang tinimbang sing katon sepisanan.
GO TO FULL VERSION