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

Ungkapan Biasa di Jawa, Bahagian 1

Diterbitkan dalam kumpulan
Kami membawa kepada perhatian anda terjemahan panduan ringkas kepada ungkapan biasa dalam bahasa Jawa, 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 1 - 1

Menggunakan API Ekspresi Biasa dalam Program Java untuk Mengenal dan Menghuraikan Corak

Watak Java dan pelbagai jenis data rentetan menyediakan sokongan peringkat rendah untuk padanan corak, tetapi menggunakannya untuk tujuan ini biasanya menambahkan kerumitan kod yang ketara. Kod yang lebih ringkas dan lebih berprestasi diperoleh dengan menggunakan API Regex ("API Ekspresi Biasa"). Tutorial ini akan membantu anda bermula dengan ungkapan biasa dan API Regex. Mula-mula kita akan membincangkan tiga kelas paling menarik dalam pakej secara umum java.util.regex, dan kemudian lihat di dalam kelas Patterndan meneroka binaan padanan coraknya yang canggih. Perhatian: Anda boleh memuat turun kod sumber (dicipta oleh Jeff Friesen untuk tapak JavaWorld) aplikasi demo daripada artikel ini dari sini .

Apakah ungkapan biasa?

Ungkapan biasa (ungkapan biasa/regex/regexp) ialah rentetan yang merupakan corak yang menerangkan set rentetan tertentu. Corak menentukan baris mana yang tergolong dalam set. Corak itu terdiri daripada huruf tersurat dan aksara meta—karakter dengan makna istimewa dan bukannya makna literal. Padanan corak ialah carian teks untuk mencari padanan, iaitu rentetan yang sepadan dengan corak ungkapan biasa. Java menyokong padanan corak melalui API Regexnya. API ini terdiri daripada tiga kelas: Pattern, Matcherdan PatternSyntaxException, terletak dalam pakej java.util.regex:
  • class objects Pattern, juga dipanggil templat, dihimpunkan ungkapan biasa.
  • class objects Matcher, atau matchers, ialah mekanisme tafsiran corak untuk mencari padanan dalam jujukan aksara (objek yang kelasnya melaksanakan antara muka java.lang.CharSequencedan berfungsi sebagai sumber teks).
  • Objek kelas PatternSyntaxExceptiondigunakan untuk menerangkan corak ungkapan biasa yang tidak sah.
Java juga menyediakan sokongan untuk padanan corak melalui pelbagai kaedah java.lang.String. Sebagai contoh, fungsi boolean matches (String regex)kembali truehanya jika rentetan panggilan sepadan dengan ungkapan biasa tepat regex.
Kaedah yang mudah
matches()dan kaedah kemudahan berorientasikan ekspresi biasa lain dalam kelas Stringdilaksanakan di bawah hud dengan cara yang serupa dengan API Regex.

RegexDemo

Saya mencipta aplikasi RegexDemountuk menunjukkan ungkapan biasa Java dan pelbagai kaedah Pattern, Matcherdan PatternSyntaxException. Di bawah ialah kod sumber untuk aplikasi demo ini. Penyenaraian 1. Demonstrasi ungkapan biasa
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class RegexDemo
{
   public static void main(String[] args)
   {
      if (args.length != 2)
      {
         System.err.println("usage: java RegexDemo regex input");
         return;
      }
      // Преобразуем символьные последовательности начала новой строки (\n) в символы начала строки.
      args[1] = args[1].replaceAll("\\\\n", "\n");
      try
      {
         System.out.println("regex = " + args[0]);
         System.out.println("input = " + args[1]);
         Pattern p = Pattern.compile(args[0]);
         Matcher m = p.matcher(args[1]);
         while (m.find())
            System.out.println("Found [" + m.group() + "] starting at "
                               + m.start() + " and ending at " + (m.end() - 1));
      }
      catch (PatternSyntaxException pse)
      {
         System.err.println("Неправильное регулярное выражение: " + pse.getMessage());
         System.err.println("Описание: " + pse.getDescription());
         System.err.println("Позиция: " + pse.getIndex());
         System.err.println("Неправильный шаблон: " + pse.getPattern());
      }
   }
}
Perkara pertama yang dilakukan oleh kaedah mainkelas RegexDemoialah menyemak baris arahannya. Ia memerlukan dua hujah: yang pertama ialah ungkapan biasa, dan yang kedua ialah teks input di mana ungkapan biasa akan dicari. Anda mungkin perlu menggunakan aksara baris baharu dalam teks input (\n). Ini hanya boleh dilakukan dengan menyatakan watak \diikuti oleh watak itu n. Fungsi main()menukar jujukan aksara ini kepada nilai Unicode 10. Ungkapan Biasa dalam Java, Bahagian 1 - 2Sebahagian besar kod RegexDemodisertakan dalam try-catch. Blok itu trymula-mula mengeluarkan ungkapan biasa yang diberikan dan teks input, dan kemudian mencipta objek Patternyang menyimpan ungkapan biasa yang disusun (ungkapan biasa disusun untuk meningkatkan prestasi padanan corak). Padanan diekstrak daripada objek Patterndan digunakan untuk mencari padanan secara berulang sehingga semuanya ditemui. Blok catchmemanggil beberapa kaedah kelas PatternSyntaxExceptionuntuk mendapatkan maklumat berguna tentang pengecualian. Maklumat ini dikeluarkan secara berurutan ke aliran keluaran. Tidak perlu mengetahui butiran tentang cara kod berfungsi lagi: ia akan menjadi jelas apabila kita mengkaji API di bahagian kedua artikel. Walau bagaimanapun, anda mesti menyusun Penyenaraian 1. Ambil kod dari Penyenaraian 1, dan kemudian taip arahan berikut pada gesaan arahan untuk menyusun RegexDemo: javac RegexDemo.java

Kelas Corak dan binaannya

Kelas Pattern, yang pertama daripada tiga kelas yang membentuk API Regex, ialah perwakilan terkumpul bagi ungkapan biasa. Dokumentasi SDK kelas Patternmenerangkan pelbagai binaan ungkapan biasa, tetapi jika anda tidak menggunakan ungkapan biasa secara aktif, sebahagian daripada dokumentasi ini mungkin mengelirukan. Apakah pengkuantiti dan apakah perbezaan antara pengkuantiti tamak, enggan dan memiliki? Apakah itu kelas aksara, pemadan sempadan, rujukan belakang dan ungkapan bendera terbenam? Saya akan menjawab soalan ini dan soalan lain dalam bahagian berikut.

Rentetan literal

Pembinaan ungkapan biasa yang paling mudah ialah rentetan literal. Untuk pemadanan corak berjaya, beberapa bahagian teks input mesti sepadan dengan corak binaan tersebut. Pertimbangkan contoh berikut: java RegexDemo apple applet Dalam contoh ini, kami cuba mencari padanan untuk corak appledalam teks input applet. Keputusan berikut menunjukkan perlawanan ditemui:
regex = apple
input = applet
Found [apple] starting at 0 and ending at 4
Kami melihat dalam output ungkapan biasa dan teks input, dan kemudian petunjuk pengesanan yang berjaya appledalam applet. Selain itu, kedudukan permulaan dan penamat perlawanan ini diberikan: 0dan 4, masing-masing. Kedudukan mula menunjukkan tempat pertama dalam teks di mana perlawanan ditemui, dan kedudukan akhir menunjukkan titik terakhir perlawanan. Sekarang katakan kita memberikan baris arahan berikut: java RegexDemo apple crabapple Kali ini kita mendapat hasil berikut, dengan kedudukan permulaan dan penamat yang berbeza:
regex = apple
input = crabapple
Found [apple] starting at 4 and ending at 8
Jika tidak, dengan dan appletsebagai ungkapan biasa apple- teks input, tiada padanan akan ditemui. Seluruh ungkapan biasa mesti sepadan, tetapi dalam kes ini, teks input tidak mengandungi tselepas apple. Ungkapan Biasa dalam Java, Bahagian 1 - 3

Metacharacters

Konstruk ungkapan biasa yang lebih menarik menggabungkan aksara literal dengan aksara meta. Contohnya, dalam ungkapan biasa a.b, metakarakter titik (.)bermaksud sebarang aksara antara adan b. Pertimbangkan contoh berikut: java RegexDemo .ox "The quick brown fox jumps over the lazy ox." Contoh ini menggunakan .oxkedua-duanya sebagai ungkapan biasa dan The quick brown fox jumps over the lazy ox.sebagai teks input. RegexDemomencari teks untuk padanan bermula dengan mana-mana watak dan berakhir dengan ox.Keputusan pelaksanaannya adalah seperti berikut:
regex = .ox
input = The quick brown fox jumps over the lazy ox.
Found [fox] starting at 16 and ending at 18
Found [ ox] starting at 39 and ending at 41
Dalam output kita melihat dua padanan: foxdan ox(dengan watak ruang di hadapannya). Metacharacter . sepadan dengan watak fdalam kes pertama dan ruang dalam kes kedua. Apa yang berlaku jika anda menggantikannya .oxdengan metacharacter .? Iaitu, apa yang kita dapat hasil daripada baris arahan berikut: java RegexDemo . "The quick brown fox jumps over the lazy ox." Memandangkan metacharacter titik sepadan dengan mana-mana aksara, RegexDemoakan mengeluarkan padanan ditemui untuk semua aksara (termasuk aksara titik mengekor) teks input:
regex = .
input = The quick brown fox jumps over the lazy ox.
Found [T] starting at 0 and ending at 0
Found [h] starting at 1 and ending at 1
Found [e] starting at 2 and ending at 2
Found [ ] starting at 3 and ending at 3
Found [q] starting at 4 and ending at 4
Found [u] starting at 5 and ending at 5
Found [i] starting at 6 and ending at 6
Found [c] starting at 7 and ending at 7
Found [k] starting at 8 and ending at 8
Found [ ] starting at 9 and ending at 9
Found [b] starting at 10 and ending at 10
Found [r] starting at 11 and ending at 11
Found [o] starting at 12 and ending at 12
Found [w] starting at 13 and ending at 13
Found [n] starting at 14 and ending at 14
Found [ ] starting at 15 and ending at 15
Found [f] starting at 16 and ending at 16
Found [o] starting at 17 and ending at 17
Found [x] starting at 18 and ending at 18
Found [ ] starting at 19 and ending at 19
Found [j] starting at 20 and ending at 20
Found [u] starting at 21 and ending at 21
Found [m] starting at 22 and ending at 22
Found [p] starting at 23 and ending at 23
Found [s] starting at 24 and ending at 24
Found [ ] starting at 25 and ending at 25
Found [o] starting at 26 and ending at 26
Found [v] starting at 27 and ending at 27
Found [e] starting at 28 and ending at 28
Found [r] starting at 29 and ending at 29
Found [ ] starting at 30 and ending at 30
Found [t] starting at 31 and ending at 31
Found [h] starting at 32 and ending at 32
Found [e] starting at 33 and ending at 33
Found [ ] starting at 34 and ending at 34
Found [l] starting at 35 and ending at 35
Found [a] starting at 36 and ending at 36
Found [z] starting at 37 and ending at 37
Found [y] starting at 38 and ending at 38
Found [ ] starting at 39 and ending at 39
Found [o] starting at 40 and ending at 40
Found [x] starting at 41 and ending at 41
Found [.] starting at 42 and ending at 42
Petikan aksara meta
Untuk menentukan .atau mana-mana metacharacter lain sebagai aksara literal dalam binaan ungkapan biasa, anda mesti melepaskannya dalam salah satu cara berikut:
  • mendahuluinya dengan aksara sengkang terbalik;
  • Letakkan metacharacter ini antara \Qdan \E(contohnya, \Q.\E).
Ingat untuk menduplikasi mana-mana aksara yang muncul dalam rentetan literal, seperti String regex = "\\.";garis miring ke belakang (contohnya, \\.atau \\Q.\\E). Jangan salin garis miring ke belakang yang merupakan sebahagian daripada hujah baris arahan.

Kelas watak

Kadangkala anda perlu mengehadkan padanan yang anda cari kepada set aksara tertentu. Contohnya, cari teks untuk vokal a, e, i, odan u, dengan setiap kemunculan huruf vokal dianggap sebagai padanan. Dalam menyelesaikan masalah sedemikian, kita akan dibantu oleh kelas aksara yang mentakrifkan set aksara antara metakarakter kurungan segi empat sama ( [ ]). Kelas Patternmenyokong kelas aksara mudah, kelas julat, songsang, kesatuan, persilangan dan kelas penolakan. Kami akan melihat kesemuanya sekarang.

Kelas Watak Mudah

Kelas aksara ringkas terdiri daripada aksara yang diletakkan bersebelahan dan hanya sepadan dengan aksara tersebut. Sebagai contoh, kelas [abc]sepadan dengan aksara a, bdan c. Pertimbangkan contoh berikut: java RegexDemo [csw] cave Seperti yang anda boleh lihat daripada keputusan, dalam contoh ini hanya watak cyang terdapat padanan dalam cave:
regex = [csw]
input = cave
Found [c] starting at 0 and ending at 0

Kelas aksara terbalik

Kelas aksara terbalik bermula dengan aksara meta ^dan hanya sepadan dengan aksara yang tidak terkandung di dalamnya. Sebagai contoh, kelas [^abc]sepadan dengan semua aksara kecuali a, bdan c. Pertimbangkan contoh berikut: Ambil java RegexDemo "[^csw]" cave perhatian bahawa pada sistem pengendalian saya (Windows) petikan berganda diperlukan kerana shell menganggapnya ^sebagai watak melarikan diri. Seperti yang anda lihat, dalam contoh ini hanya aksara a, vdan ditemui e, yang mana terdapat padanan dalam cave:
regex = [^csw]
input = cave
Found [a] starting at 1 and ending at 1
Found [v] starting at 2 and ending at 2
Found [e] starting at 3 and ending at 3

Kelas watak julat

Kelas aksara julat terdiri daripada dua aksara yang dipisahkan oleh tanda sempang ( -). Semua aksara, bermula dengan aksara di sebelah kiri tanda sempang dan berakhir dengan aksara di sebelah kanan, adalah sebahagian daripada julat. Sebagai contoh, julat [a-z]sepadan dengan semua huruf Latin huruf kecil. Ini bersamaan dengan mentakrifkan kelas mudah [abcdefghijklmnopqrstuvwxyz]. Pertimbangkan contoh berikut: java RegexDemo [a-c] clown Contoh ini hanya akan sepadan dengan watak cyang mempunyai padanan dalam clown:
regex = [a-c]
input = clown
Found [c] starting at 0 and ending at 0
Ungkapan Biasa dalam Jawa, Ungkapan Biasa Bahagian 2 dalam Jawa, Ungkapan Biasa Bahagian 3 dalam Jawa, Ungkapan Biasa Bahagian 4 dalam Jawa, Bahagian 5
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION