JavaRush /Blog Jawa /Random-JV /Ekspresi Reguler ing Jawa (RegEx)

Ekspresi Reguler ing Jawa (RegEx)

Diterbitake ing grup
Ekspresi reguler minangka topik sing para programer, malah sing wis pengalaman, asring dibuwang nganti mengko. Nanging, umume pangembang Java cepet utawa mengko kudu ngatasi pangolahan teks. Paling asring - kanthi operasi telusuran ing teks lan panyuntingan. Tanpa ekspresi reguler, kode program sing produktif lan kompak sing ana gandhengane karo pangolahan teks ora bisa dipikirake. Dadi mandheg mandheg, ayo padha ngatasi "biasa" saiki. Iki dudu tugas sing angel.

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:
  1. nulis minangka string nggunakake sintaks ekspresi reguler;
  2. ngumpulake senar iki dadi ekspresi biasa;
Nggarap ekspresi reguler ing sembarang program Jawa diwiwiti kanthi nggawe obyek kelas 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 flagsditemtokake ing kelas Patternlan 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 Patternminangka konstruktor ekspresi reguler. Ing hood, cara compilenelpon konstruktor pribadi kelas Patternkanggo 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:
1. Metakarakter kanggo wates garis sing cocog utawa teks
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
2. Metakarakter kanggo nggoleki kelas karakter
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
3. Metakarakter kanggo nggoleki simbol panyuntingan teks
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
4. Metakarakter kanggo ngelompokake karakter
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)
5. Metasymbols kanggo nunjukaké nomer karakter - quantifiers. Quantifier tansah teka sawise karakter utawa klompok karakter.
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:
  1. Ing pola sing diwenehake, karakter pisanan yaiku karakter huruf Rusia А. Matchercocog karo saben karakter teks, wiwit saka posisi nol. Ing posisi nol ing teks kita ana simbol Е, supaya Matcherliwat karakter ing teks sequentially nganti ketemu cocog karo pola. Ing conto kita, iki minangka simbol ing posisi No.

    Ungkapan Biasa ing Basa Jawa - 2
  2. Sawise cocog ditemokake karo karakter pisanan saka pola, Matchermriksa cocog karo karakter kapindho pola. Ing kasus kita, iki minangka simbol " .", sing tegese karakter apa wae.

    Ungkapan Biasa ing Basa Jawa - 3

    Ing posisi kaping enem ana simbol huruf л. Mesthine, cocog karo pola "karakter apa wae".

  3. Matcherpindhah 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, Matchermula 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).

    Ungkapan Biasa ing Basa Jawa - 4

    Nyatane, Matcheriku njupuk kabeh baris kanggo mburi - iki ngendi "rakus" manifests dhewe.

  4. Sawise Matchertekan 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:

    Ungkapan Biasa ing Basa Jawa - 5
  5. Matcher"ngelingi" jumlah repetisi ing pola " .+" sing wis tekan pungkasan teks, mula ngurangi jumlah repetisi siji lan mriksa pola teks nganti ketemu sing cocog: Ungkapan Biasa ing Basa Jawa - 6

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. Ungkapan Biasa ing Basa Jawa - 7

Mode quantifier malas

  1. Ing mode iki, ing tahap wiwitan, kaya ing mode rakus, pertandhingan digoleki kanthi karakter pisanan saka pola kasebut:

    Ungkapan Biasa ing Basa Jawa - 8
  2. Sabanjure, goleki sing cocog karo karakter sabanjure ing pola - karakter apa wae:

    Ungkapan Biasa ing Basa Jawa - 9
  3. 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, Matcherbakal mriksa yen teks cocog karo pola liyane - karakter " а" .

    Ungkapan Biasa ing Jawa - 10
  4. Wiwit cocog karo pola ing teks ora ditemokake (ing posisi No. 7 ing teks ana simbol " л"), Matchernambah "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:

    Ungkapan Biasa ing Basa Jawa - 11
  5. Ing kasus kita, match ditemokake, nanging pungkasan teks durung tekan. Mulane, saka posisi No.

    Ungkapan Biasa ing Jawa - 12
Minangka asil saka cara, mainnalika 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 kasebut Patternnduweni 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 flagsnilai 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 limitnemtokake jumlah maksimum sing cocog sing digoleki ing teks:
  • nalika limit>0- nelusuri limit-1pertandhingan ditindakake;
  • ing limit<0– nelusuri kabeh cocog ing teks
  • nalika limit=0– nelusuri kabeh cocog ing teks, nalika baris kosong ing mburi Uploaded dibuwak;
Tuladha:
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 Matchering ngisor iki.

Metode kelas matcher

Matcheryaiku 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, Matchercara 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. StringSampeyan bisa pass ora mung , nanging uga StringBuffer, StringBuilder, Segmentlan minangka argumentasi CharBuffer. Cithakan telusuran minangka obyek kelas Patternsing 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 replaceFirstnggawe replaceAllobyek anyar String- senar, kang yaiku teks sumber sing cocog karo cithakan diganti karo teks sing dikirim menyang metode minangka argumen. Menapa malih, cara replaceFirstngganti mung match pisanan, lan replaceAllkabeh 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 Patternlan Matcherdibangun ing String. Iki minangka cara kayata split, matches, replaceFirst, replaceAll. Nanging nyatane, "ing hood" padha nggunakake Patternlan 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 Patternlan 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 kelas Patternlan nggunakake obyek kelas Matcherkanggo 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.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION