JavaRush /Blog Java /Random-MS /Ungkapan Biasa di Jawa, Bahagian 2

Ungkapan Biasa di Jawa, Bahagian 2

Diterbitkan dalam kumpulan
Kami menyampaikan kepada perhatian anda terjemahan panduan ringkas kepada ungkapan biasa dalam Java, yang ditulis oleh Jeff Friesen untuk tapak web javaworld . Untuk memudahkan pembacaan, kami telah membahagikan artikel tersebut kepada beberapa bahagian. Ungkapan Biasa dalam Java, Bahagian 2 - 1Ungkapan Biasa di Jawa, Bahagian 1
Menggabungkan berbilang julat
Anda boleh menggabungkan berbilang julat ke dalam kelas aksara julat tunggal dengan meletakkannya bersebelahan. Sebagai contoh, kelas [a-zA-Z]memadankan semua aksara abjad Latin dalam huruf kecil atau besar.

Menggabungkan berbilang julat

Anda boleh menggabungkan berbilang julat ke dalam kelas aksara julat tunggal dengan meletakkannya bersebelahan. Sebagai contoh, kelas [a-zA-Z]memadankan semua aksara abjad Latin dalam huruf kecil atau besar.

Menggabungkan Kelas Watak

Kesatuan kelas aksara terdiri daripada beberapa kelas aksara bersarang dan memadankan semua aksara dalam kesatuan yang terhasil. Sebagai contoh, kelas [a-d[m-p]]memadankan aksara dari ake ddan dari mke p. Pertimbangkan contoh berikut: java RegexDemo [ab[c-e]] abcdef Contoh ini akan mencari aksara a, b, c, ddan e, yang terdapat padanan dalam 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 watak

Persilangan kelas aksara terdiri daripada aksara biasa kepada semua kelas bersarang dan hanya sepadan dengan aksara biasa. Sebagai contoh, kelas [a-z&&[d-f]]sepadan dengan aksara d, edan f. Pertimbangkan contoh berikut: Ambil java RegexDemo "[aeiouy&&[y]]" party perhatian bahawa pada sistem pengendalian Windows saya, petikan berganda diperlukan kerana shell arahan menganggapnya &sebagai pemisah arahan. Contoh ini hanya akan mencari watak yyang mempunyai padanan dalam party:
regex = [aeiouy&&[y]]
input = party
Found [y] starting at 4 and ending at 4

Menolak kelas aksara

Kelas aksara penolakan terdiri daripada semua aksara kecuali yang terkandung dalam kelas aksara bersarang dan hanya sepadan dengan aksara yang tinggal. Sebagai contoh, kelas [a-z&&[^m-p]]memadankan aksara dari ake ldan dari qke z: java RegexDemo "[a-f&&[^a-c]&&[^e]]" abcdefg Contoh ini akan mencari aksara ddan fyang mana terdapat padanan dalam 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 Watak Dipratentukan

Sesetengah kelas aksara muncul cukup kerap dalam ungkapan biasa untuk mewajarkan penggunaan tatatanda trengkas. Kelas ini Patternmenawarkan kelas aksara yang dipratentukan sebagai singkatan tersebut. Anda boleh menggunakannya untuk memudahkan ungkapan biasa anda dan meminimumkan ralat sintaks. Terdapat beberapa kategori kelas aksara yang dipratentukan: java.lang.Characterciri standard, POSIX dan Unicode seperti skrip, blok, kategori dan binari. Senarai berikut hanya menunjukkan kategori kelas standard:
  • \d: Nombor. Bersamaan [0-9].
  • \D: Aksara bukan angka. Bersamaan [^0-9].
  • \s: aksara ruang putih. Bersamaan [ \t\n\x0B\f\r].
  • \S: Bukan aksara ruang kosong. Bersamaan [^\s].
  • \w: Simbol pembentuk perkataan. Bersamaan [a-zA-Z_0-9].
  • \W: Bukan watak membentuk perkataan. Bersamaan [^\w].
Contoh berikut menggunakan kelas aksara yang dipratentukan \wuntuk menerangkan semua aksara perkataan dalam teks input: java RegexDemo \w "aZ.8 _" Lihat dengan teliti pada hasil pelaksanaan berikut, yang menunjukkan bahawa aksara tempoh dan ruang tidak dianggap sebagai aksara perkataan:
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 talian
Dokumentasi SDK kelas Patternmenerangkan metakarakter titik sebagai kelas aksara pratakrif yang sepadan dengan mana-mana aksara kecuali pemisah baris (jujukan satu atau dua aksara yang menandakan penghujung baris). Pengecualian ialah mod dotall (yang akan kita bincangkan seterusnya), di mana titik juga sepadan dengan pemisah garis. Kelas Patternmembezakan pemisah baris berikut:
  • watak pemulangan pengangkutan ( \r);
  • aksara baris baharu (simbol untuk memajukan kertas satu baris) ( \n);
  • aksara pemulangan kereta serta-merta diikuti dengan aksara baris baharu ( \r\n);
  • aksara baris seterusnya ( \u0085);
  • aksara pemisah baris ( \u2028);
  • simbol pemisah perenggan ( \u2029)

Kumpulan yang ditangkap

Kumpulan penangkapan digunakan untuk menyimpan set aksara yang ditemui untuk kegunaan selanjutnya apabila mencari mengikut corak. Konstruk ini ialah jujukan aksara yang disertakan dalam aksara meta dengan tanda kurungan ( ( )). Semua aksara dalam kumpulan yang ditangkap dianggap sebagai satu keseluruhan apabila mencari mengikut corak. Contohnya, kumpulan tangkapan ( Java) menggabungkan huruf J, a, vdan amenjadi satu unit. Kumpulan tangkapan ini mencari semua kemunculan corak Javadalam teks input. Dengan setiap perlawanan, aksara yang disimpan sebelumnya Javadigantikan dengan yang seterusnya. Kumpulan yang ditangkap boleh disarangkan dalam kumpulan yang ditangkap yang lain. Contohnya, dalam ungkapan biasa, (Java( language))kumpulan (language)bersarang di dalam kumpulan (Java). Setiap kumpulan tangkapan bersarang atau tidak bersarang diberikan nombor, bermula dari 1, dan penomboran pergi dari kiri ke kanan. Dalam contoh sebelumnya, (Java( language))padanan menangkap nombor kumpulan 1 dan (language)padanan menangkap nombor kumpulan 2. Dalam ungkapan biasa (a)(b), (a)padanan menangkap nombor kumpulan 1 dan (b)menangkap nombor kumpulan 2. Ungkapan Biasa di Jawa, Bahagian 2 - 2Padanan yang disimpan oleh kumpulan menangkap boleh diakses kemudian menggunakan rujukan belakang. Ditentukan sebagai aksara garis miring belakang diikuti dengan aksara angka yang sepadan dengan bilangan kumpulan yang ditangkap, rujukan belakang membolehkan anda merujuk kepada aksara dalam teks yang ditangkap oleh kumpulan itu. Mempunyai pautan balik menyebabkan pemadan merujuk kepada hasil carian disimpan kumpulan yang ditangkap berdasarkan nombor daripadanya, dan kemudian menggunakan aksara daripada hasil carian itu untuk mencuba carian selanjutnya. Contoh berikut menunjukkan penggunaan rujukan belakang untuk mencari ralat tatabahasa dalam teks: java RegexDemo "(Java( language)\2)" "The Java language language" Contoh ini (Java( language)\2)menggunakan ungkapan biasa untuk mencari ralat tatabahasa dengan perkataan pendua languageserta-merta mengikuti Javadalam teks input "The Java language language". Ungkapan biasa ini menentukan dua kumpulan untuk ditangkap: nombor 1 – (Java( language)\2), sepadan dengan Java language languagedan nombor 2 – (language), sepadan dengan aksara ruang diikuti dengan language. Rujukan belakang \2membolehkan hasil tersimpan nombor 2 kumpulan disemak semula supaya pemadan boleh mencari kejadian kedua ruang diikuti dengan language, sejurus selepas kejadian pertama ruang dan language. Keputusan padanan RegexDemoadalah seperti berikut:
regex = (Java( language)\2)
input = The Java language language
Found [Java language language] starting at 4 and ending at 25

Penjodoh sempadan

Kadangkala anda perlu melakukan padanan corak pada permulaan baris, pada sempadan perkataan, pada akhir teks, dsb. Anda boleh melakukan ini dengan menggunakan salah satu pemadan tepi kelas Pattern, yang merupakan binaan ungkapan biasa yang mencari padanan di lokasi berikut:
  • ^: Permulaan baris;
  • $: Akhir baris;
  • \b: Sempadan perkataan;
  • \B: Sempadan kata pseudo;
  • \A: Permulaan teks;
  • \G: Tamat perlawanan sebelumnya;
  • \Z: Akhir teks, tidak termasuk pemisah garis belakang (jika ada);
  • \z: Akhir teks
Contoh berikut menggunakan ^metacharacter pemadan sempadan untuk mencari baris yang bermula dengan The, diikuti dengan sifar atau lebih aksara perkataan: java RegexDemo "^The\w*" Therefore Aksara ^menentukan bahawa tiga aksara pertama teks input mesti sepadan dengan aksara corak berturut-turut dan T, yang boleh diikuti oleh sebarang nombor simbol pembentuk kata. Berikut adalah hasil pelaksanaan: he
regex = ^The\w*
input = Therefore
Found [Therefore] starting at 0 and ending at 8
Apa yang berlaku jika anda menukar baris arahan kepada java RegexDemo "^The\w*" " Therefore"? Tiada padanan akan ditemui kerana Thereforeteks input didahului oleh aksara ruang.

Padanan panjang sifar

Kadangkala, apabila bekerja dengan pemadan tepi, anda akan menghadapi padanan panjang sifar. Совпадение нулевой длиныialah padanan yang tidak mengandungi sebarang aksara. Ia boleh berlaku dalam teks input kosong, pada permulaan teks input, selepas aksara terakhir teks input, dan antara mana-mana dua aksara teks input. Padanan panjang sifar mudah dikenali kerana ia sentiasa bermula dan berakhir pada kedudukan yang sama. Pertimbangkan contoh berikut: java RegExDemo \b\b "Java is" Contoh ini mencari dua sempadan perkataan berturut-turut dan hasilnya kelihatan seperti ini:
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
Kami melihat beberapa perlawanan panjang sifar dalam keputusan. Kedudukan penamat di sini adalah kurang satu daripada kedudukan permulaan, kerana RegexDemosaya nyatakan dalam kod sumber dalam Penyenaraian 1 end() – 1. Ungkapan Biasa di Jawa, Bahagian 2 - 3

Pengkuantiti

Pengkuantiti ialah binaan ungkapan biasa yang secara eksplisit atau tersirat mengaitkan corak dengan nilai berangka. Nilai angka ini menentukan berapa kali untuk mencari corak. Pengkuantiti dibahagikan kepada tamak, malas dan super tamak:
  • Pengkuantiti tamak ( ?, *atau +) direka untuk mencari padanan terpanjang. Boleh saya tanya X? untuk mencari satu atau kurang kejadian X, X*untuk mencari sifar atau lebih kejadian X, X+untuk mencari satu atau lebih kejadian X, X{n}untuk mencari nkejadian X, X{n,}untuk mencari sekurang-kurangnya (dan mungkin lebih) nkejadian , Xdan X{n,m}untuk mencari sekurang-kurangnya ntetapi tidak lebih mkejadian X.
  • Pengkuantiti malas ( ??, *?atau +?) direka bentuk untuk mencari padanan terpendek. Anda boleh menentukan X??untuk mencari satu atau kurang kejadian X, X*? untuk mencari sifar atau lebih kejadian X, X+?mencari satu atau lebih kejadian X, X{n}?mencari nkejadian X, X{n,}?mencari sekurang-kurangnya (dan mungkin lebih banyak) nkejadian X, dan X{n,m}?mencari sekurang-kurangnya ntetapi tidak lebih daripada mkejadian X.
  • Pengkuantiti super tamak ( ?+, *+atau ++) adalah serupa dengan pengkuantiti rakus, kecuali pengkuantiti super tamak hanya membuat satu percubaan untuk mencari padanan terpanjang, manakala pengkuantiti tamak boleh membuat beberapa percubaan. Boleh ditetapkan X?+untuk mencari satu atau kurang kejadian X, X*+mencari sifar atau lebih kejadian X, X++mencari satu atau lebih kejadian X, X{n}+mencari nkejadian X, X{n,}+mencari sekurang-kurangnya (dan mungkin lebih banyak) nkejadian , Xdan X{n,m}+ mencari sekurang-kurangnya ntetapi tidak lebih daripada mkejadian X.
Contoh berikut menggambarkan penggunaan pengkuantiti tamak: java RegexDemo .*ox "fox box pox" Berikut ialah keputusannya:
regex = .*ox
input = fox box pox
Found [fox box pox] starting at 0 and ending at 10
Pengkuantiti tamak ( .*) mencari urutan aksara terpanjang yang berakhir dengan ox. Ia menggunakan keseluruhan teks input dan kemudian digulung semula sehingga ia mengesan bahawa teks input berakhir dengan aksara ini. Pertimbangkan sekarang pengkuantiti malas: java RegexDemo .*?ox "fox box pox" Hasilnya:
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
Pengkuantiti malas ( .*?) mencari jujukan aksara terpendek yang berakhir dengan ox. Ia bermula dengan rentetan kosong dan secara beransur-ansur menggunakan aksara sehingga ia menemui padanan. Dan kemudian terus bekerja sehingga teks input habis. Akhir sekali, mari kita lihat pengkuantiti super tamak: java RegexDemo .*+ox "fox box pox" Dan berikut adalah keputusannya:
regex = .*+ox
input = fox box pox
Pengkuantiti lebih tamak ( .*+) tidak menemui padanan kerana ia menggunakan semua teks input dan tiada apa-apa lagi untuk dipadankan oxpada penghujung ungkapan biasa. Berbeza dengan pengkuantiti tamak, pengkuantiti super tamak tidak berpatah balik.

Padanan panjang sifar

Kadangkala apabila bekerja dengan pengkuantiti anda akan menghadapi padanan panjang sifar. Contohnya, menggunakan pengkuantiti tamak berikut menghasilkan beberapa padanan panjang sifar: java RegexDemo a? abaa Keputusan menjalankan contoh ini:
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
Terdapat lima perlawanan dalam keputusan pelaksanaan. Walaupun yang pertama, ketiga dan keempat agak dijangka (ia sepadan dengan kedudukan tiga huruf adalam abaa), yang kedua dan kelima mungkin mengejutkan anda. Nampaknya seolah-olah mereka menunjukkan apa ayang sepadan bdengan akhir teks, tetapi sebenarnya ini tidak berlaku. Ungkapan biasa a?tidak mencari bpada akhir teks. Ia mencari kehadiran atau ketiadaan a. Apabila a?ia tidak menjumpai a, ia melaporkannya sebagai padanan panjang sifar.

Ungkapan bendera bersarang

Padanan membuat beberapa andaian lalai yang boleh ditindih apabila menyusun ungkapan biasa ke dalam corak. Kami akan membincangkan isu ini kemudian. Ungkapan biasa membolehkan anda mengatasi mana-mana lalai menggunakan ungkapan bendera bersarang. Konstruk ungkapan biasa ini dinyatakan sebagai metakarakter kurungan di sekeliling tanda tanya metacharacter ( ?), diikuti dengan huruf Latin huruf kecil. Kelas Patternmemahami ungkapan bendera bersarang berikut:
  • (?i): Mendayakan padanan corak tidak peka huruf besar-besaran. Contohnya, apabila menggunakan arahan, java RegexDemo (?i)tree Treehouseurutan aksara Treesepadan dengan corak tree. Lalai ialah carian corak sensitif huruf besar-besaran.
  • (?x): Membenarkan penggunaan aksara ruang putih dan ulasan bermula dengan aksara meta dalam corak #. Penjodoh akan mengabaikan kedua-duanya. Sebagai contoh, untuk java RegexDemo ".at(?x)#match hat, cat, and so on" matterurutan aksara matyang sepadan dengan corak .at. Secara lalai, aksara ruang kosong dan ulasan tidak dibenarkan, dan pemadan menganggapnya sebagai aksara yang terlibat dalam carian.
  • (?s): Mendayakan mod dotall, yang mana metacharacter titik sepadan dengan pemisah garis sebagai tambahan kepada mana-mana aksara lain. Sebagai contoh, arahan java RegexDemo (?s). \nakan mencari aksara baris baharu. Lalai adalah bertentangan dengan dotall: tiada pemisah baris akan ditemui. Sebagai contoh, arahan Java RegexDemo . \ntidak akan mencari aksara baris baharu.
  • (?m): Mengaktifkan mod berbilang baris, di mana ia ^sepadan dengan permulaan dan $penghujung setiap baris. Sebagai contoh, java RegexDemo "(?m)^abc$" abc\nabcmencari kedua-dua jujukan dalam teks input abc. Secara lalai, mod satu baris digunakan: ^sepadan dengan permulaan keseluruhan teks input dan $sepadan dengan penghujungnya. Contohnya, java RegexDemo "^abc$" abc\nabcmengembalikan respons bahawa tiada padanan.
  • (?u): Mendayakan penjajaran huruf sensitif Unikod. Bendera ini, apabila digunakan bersama dengan (?i), membenarkan padanan corak tidak peka huruf besar-besaran mengikut piawaian Unicode. Tetapan lalai adalah untuk mencari aksara sensitif huruf besar dan AS-ASCII sahaja.
  • (?d): Mendayakan mod rentetan gaya Unix, di mana pemadan mengenali aksara meta dalam konteks ., ^dan $hanya pemisah baris \n. Lalai ialah mod rentetan gaya bukan Unix: pemadan mengenali, dalam konteks aksara meta di atas, semua pembatas baris.
Ungkapan bendera bersarang menyerupai kumpulan yang ditangkap kerana watak mereka dikelilingi oleh metakarakter kurungan. Tidak seperti kumpulan yang ditangkap, ungkapan bendera bersarang ialah contoh kumpulan yang tidak ditangkap, yang merupakan binaan ungkapan biasa yang tidak menangkap aksara teks. Ia ditakrifkan sebagai jujukan aksara yang dikelilingi oleh metakarakter kurungan.
Menentukan Berbilang Ungkapan Bendera Bersarang
Adalah mungkin untuk menentukan berbilang ungkapan bendera bersarang dalam ungkapan biasa dengan sama ada meletakkannya bersebelahan ( (?m)(?i))) atau meletakkan huruf yang mentakrifkannya secara berurutan ( (?mi)).

Kesimpulan

Seperti yang anda mungkin sedar sekarang, ungkapan biasa sangat berguna dan menjadi lebih berguna apabila anda menguasai nuansa sintaksnya. Setakat ini saya telah memperkenalkan anda kepada asas ungkapan biasa dan Pattern. Dalam Bahagian 2, kami akan melihat lebih mendalam ke dalam Regex API dan meneroka kaedah Pattern, Matcherdan PatternSyntaxException. Saya juga akan menunjukkan kepada anda dua aplikasi praktikal API Regex yang boleh anda gunakan dengan segera dalam program anda. Ungkapan Biasa di Jawa, Bahagian 3 Ungkapan Biasa di Jawa, Bahagian 4 Ungkapan Biasa di Jawa, Bahagian 5
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION