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.
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
Pattern
dan 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
,
Matcher
dan
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.CharSequence
dan berfungsi sebagai sumber teks).
- Objek kelas
PatternSyntaxException
digunakan 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
true
hanya jika rentetan panggilan sepadan dengan ungkapan biasa tepat
regex
.
Kaedah yang mudah |
matches() dan kaedah kemudahan berorientasikan ekspresi biasa lain dalam kelas String dilaksanakan di bawah hud dengan cara yang serupa dengan API Regex. |
RegexDemo
Saya mencipta aplikasi
RegexDemo
untuk menunjukkan ungkapan biasa Java dan pelbagai kaedah
Pattern
,
Matcher
dan
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;
}
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
main
kelas
RegexDemo
ialah 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.
Sebahagian besar kod
RegexDemo
disertakan dalam
try-catch
. Blok itu
try
mula-mula mengeluarkan ungkapan biasa yang diberikan dan teks input, dan kemudian mencipta objek
Pattern
yang menyimpan ungkapan biasa yang disusun (ungkapan biasa disusun untuk meningkatkan prestasi padanan corak). Padanan diekstrak daripada objek
Pattern
dan digunakan untuk mencari padanan secara berulang sehingga semuanya ditemui. Blok
catch
memanggil beberapa kaedah kelas
PatternSyntaxException
untuk 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
Pattern
menerangkan 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
apple
dalam 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
apple
dalam applet. Selain itu, kedudukan permulaan dan penamat perlawanan ini diberikan:
0
dan
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
applet
sebagai ungkapan biasa
apple
- teks input, tiada padanan akan ditemui. Seluruh ungkapan biasa mesti sepadan, tetapi dalam kes ini, teks input tidak mengandungi
t
selepas
apple
.
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
a
dan b. Pertimbangkan contoh berikut:
java RegexDemo .ox "The quick brown fox jumps over the lazy ox."
Contoh ini menggunakan
.ox
kedua-duanya sebagai ungkapan biasa dan
The quick brown fox jumps over the lazy ox.
sebagai teks input.
RegexDemo
mencari 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:
fox
dan
ox
(dengan watak ruang di hadapannya). Metacharacter
.
sepadan dengan watak
f
dalam kes pertama dan ruang dalam kes kedua. Apa yang berlaku jika anda menggantikannya
.ox
dengan 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,
RegexDemo
akan 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
\Q dan \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
,
o
dan
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
Pattern
menyokong 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
,
b
dan
c
. Pertimbangkan contoh berikut:
java RegexDemo [csw] cave
Seperti yang anda boleh lihat daripada keputusan, dalam contoh ini hanya watak
c
yang 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
,
b
dan
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
,
v
dan 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
c
yang 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
Apa lagi yang perlu dibaca: |
|
GO TO FULL VERSION