Ungkapan biasa ialah sejenis corak yang boleh digunakan pada teks (String, dalam Java). Java menyediakan pakej
java.util.regex untuk memadankan ungkapan biasa. Ungkapan biasa sangat serupa dengan bahasa pengaturcaraan Perl dan sangat mudah dipelajari. Ungkapan biasa sama ada sepadan dengan teks (sebahagian daripadanya) atau tidak. * Jika ungkapan biasa sepadan dengan sekeping teks, maka kita boleh mencarinya. ** Jika ungkapan biasa adalah gabungan, maka kita boleh mengetahui dengan mudah bahagian mana ungkapan biasa sepadan dengan bahagian teks mana.
Contoh pertama
Ungkapan biasa "
[a-z] +
" sepadan dengan semua huruf kecil dalam teks.
[a-z]
bermaksud mana-mana watak dari
a
hingga
z
inklusif, dan
+
bermaksud "satu atau lebih" aksara. Katakan kita membekalkan rentetan "kod 2 belajar tutorial java". Bagaimana untuk melakukan ini dalam Java Pertama, anda mesti membuat templat:
import java.util.regex.*;
Pattern p = Pattern.compile(“[a-z]+”);
Seterusnya anda perlu mencipta
matcher
untuk teks dengan menghantar mesej pada rajah:
Matcher m = p.matcher(“code 2 learn java tutorial”);
NOTA: Kedua-duanya tidak mempunyai pembina
Pattern
,
Matcher
kami menciptanya menggunakan kaedah kelas
Pattern
.
Pattern Class:
Objek kelas membentuk perwakilan ungkapan biasa. Kelas Corak tidak menyediakan sebarang pembina awam. Untuk membuat templat, anda mesti terlebih dahulu memanggil salah satu kaedah statik awam, yang kemudiannya mengembalikan objek kelas
Pattern
. Kaedah ini mengambil ungkapan biasa sebagai hujah.
Matcher Class:
Objek Finder ialah enjin yang mentafsir corak dan melakukan operasi padanan pada rentetan input. Seperti
Pattern
kelas,
Matcher
ia tidak mempunyai pembina awam. Anda mendapat objek
Matcher
dengan memanggil kaedah
matcher
pada objek kelas
Pattern
. Sebaik sahaja kami telah menyelesaikan langkah-langkah ini, dan kini kami mempunyai contoh kelas
Matcher m
, kami kini boleh menyemak sama ada corak itu ditemui atau tidak, dan jika ya, pada kedudukan apa, dsb.
m.matches()
mengembalikan benar jika corak sepadan dengan keseluruhan rentetan, sebaliknya palsu.
m.lookingAt()
mengembalikan benar jika corak sepadan dengan permulaan rentetan, palsu sebaliknya.
m.find ()
kembali benar jika corak sepadan dengan mana-mana bahagian teks.
Mencari jodoh
Selepas perlawanan yang berjaya,
m.start() akan mengembalikan indeks aksara pertama yang dipadankan dan
m.end() akan mengembalikan indeks aksara terakhir yang dipadankan, ditambah satu. Jika percubaan yang tidak berjaya dibuat dan tiada perlawanan ditemui,
m.start()
mereka
m.end()
akan melontar
IllegalStateException
- Ini
RuntimeException
supaya anda tidak perlu menangkapnya.
Ia mungkin kelihatan pelik untuk
m.end()
mengembalikan indeks aksara terakhir yang dipadankan tambah satu, tetapi itulah yang kebanyakannya
String
.
- Sebagai contoh,
“Now is the time“.substring(m.start(), m.end())
akan mengembalikan rentetan yang sama. Mari kita lihat kod:
import java.util.regex.*;
public class RegexTest {
public static void main(String args[]) {
String pattern = "[a-z]+";
String text = "code 2 learn java tutorial";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(text);
while(m.find()) {
System.out.print(text.substring(m.start(), m.end()) + "*");
}
}
}
Output: code*learn*java*tutorial*
Kaedah Tambahan
Jika ada perlawanan, maka:
m.replaceFirst(replacement)
mengembalikan rentetan baharu, di mana subrentetan pertama yang sepadan dengan corak akan digantikanreplacement
m.replaceAll(replacement)
mengembalikan rentetan baharu, di mana setiap subrentetan yang sepadan dengan corak akan diganti
m.find(StartIndex)
cari padanan seterusnya bermula pada indeks yang ditentukan
m.reset()
menetapkan semula templat
m.reset(NewText)
menetapkan semula pencari, dan memberikannya teks baharu (mungkin String
, StringBuffer
atau CharBuffer
)
Sintaks ungkapan biasa
^
Padan dengan permulaan baris.
$
Padan dengan hujung rentetan.
.
Padan dengan mana-mana aksara tunggal kecuali baris baharu. Menggunakan pilihan m membolehkan ia sepadan dengan baris baharu.
[...]
Memadankan mana-mana aksara tunggal dalam kurungan.
[^ ...]
Memadankan mana-mana aksara tunggal yang tiada dalam kurungan.
\A
Mulakan keseluruhan baris.
\z
Tamat keseluruhan baris.
\Z
Penghujung keseluruhan baris kecuali penamat baris akhir.
re*
Memadankan 0 atau lebih kejadian bagi ungkapan sebelumnya.
re+
Satu atau lebih padanan ungkapan sebelumnya.
re?
Memadankan 0 atau 1 dengan lokasi ungkapan sebelumnya.
re{n}
Padan dengan tepat N Bilangan kejadian bagi ungkapan sebelumnya.
re{n,}
Padan dengan N atau lebih kejadian bagi ungkapan sebelumnya.
re{n, m}
Memadankan sekurang-kurangnya n dan paling banyak m kejadian bagi ungkapan sebelumnya.
a|b
Padanan a atau b.
(re)
Sekumpulan ungkapan biasa dan mengingati teks yang ditemui.
(?: re)
Kumpulan ungkapan biasa yang tidak mengingati teks yang ditemui.
(?> re)
Memadankan corak bebas tanpa pulangan.
\w
Memadankan huruf dan nombor [a-zA-Z_0-9].
\W
Ini bukan huruf atau nombor.
\s
Padan dengan ruang. Bersamaan dengan [\t\n\r\f].
\S
Bukan aksara ruang putih.
\d
Padan dengan nombor. Bersamaan dengan [0-9].
\D
Tidak sepadan dengan nombor.
\G
Padan dengan mata perlawanan terakhir.
\n
Padan dengan baris baharu.
\b
Padankan pada sempadan perkataan.
\B
Padanan bukan pada sempadan perkataan.
\n, \t, etc.
Aksara baris baharu, pemulangan pengangkutan, tab, dsb.
\Q
Petikan semua aksara sebelum \E.
\E
Petikan dimulakan dengan \Q berakhir.
GO TO FULL VERSION