1. regex (ekspresi reguler): RegularExpressions (menggantikan StringTokenizer); alat yang ampuh untuk pemrosesan string yang populer di Unix, Perl bahkan lebih baik menggunakan regex.
Terutama digunakan dalam pencocokan string, pencarian dan penggantian. Misalnya: pencocokan IP (kisaran kurang dari 256) mudah digunakan dengan ekspresi reguler; mengekstraksi sejumlah besar alamat email dari halaman web untuk mengirim spam; Berisi Matcher (hasil pencocokan string dengan pola) dan pola.
Copy kode kodenya sebagai berikut:
/*
* Memberitahukan apakah string ini cocok dengan ekspresi reguler yang diberikan (juga string).
*/
System.out.println("abc".matches("..."));//Setiap "." mewakili karakter
Copy kode kodenya sebagai berikut:
/*
* Ganti semua angka dalam string dengan "-". Metode biasa mengharuskan charAt dinilai satu per satu;
* "//d" mewakili nomor apa pun atau menggantinya dengan "[0-9]";
* "//D" mewakili non-digit apa pun atau diganti dengan "[^0-9]"
*/
System.out.println("ab54564654sbg48746bshj".replaceAll("[0-9]", "-"));//Setiap "." mewakili satu karakter
dua,
Copy kode kodenya sebagai berikut:
/*
* kompilasi mengkompilasi ekspresi reguler yang diberikan ke dalam pola (setiap kompilasi membutuhkan waktu {3} berarti tepat tiga kali);
* X{n} X, tepat n kali
* X{n,} X, setidaknya n kali
* X{n,m} X, paling sedikit n kali, tetapi tidak lebih dari m kali
*/
Pola p = Pattern.compile("[az]{3}");
Matcher m = p.matcher("ggs");//Buat matcher yang cocok dengan input yang diberikan dengan pola ini. Secara internal, otomat keadaan prioritas sebenarnya dibuat (prinsip kompilasi)
//String yang akan dicocokkan dalam matcher dan match sebenarnya adalah CharSequence (antarmuka), tetapi String mengimplementasikan antarmuka ini dan memiliki polimorfisme
System.out.println(m.matches());//Jika "ggss", maka tidak akan cocok
//Anda selalu dapat langsung "ggs".matches("[az]{3}"), tetapi cara di atas memiliki kelebihan, setidaknya lebih efisien, dan Pattern serta Matcher menyediakan banyak fungsi
3. Panggil Meta Character di regex ".*+"; ctrl+shift+"/" artinya komentar, ganti dengan "/" untuk menghapus komentar.
Copy kode kodenya sebagai berikut:
"a".matches(".");//true, "." mewakili karakter apa pun, termasuk karakter Cina
"aa".matches("aa");//true, artinya, string biasa juga dapat digunakan sebagai ekspresi reguler
/*
*benar, "*" berarti 0 karakter atau lebih, tetapi karakter berikut harus sama dengan karakter pertama.
* Jika tidak, maka salah, yaitu dinilai apakah string tersebut merupakan string yang terdiri dari karakter tunggal.
*/
"aaaa".cocok("a*");
"".cocok("a*");//benar
"aaa".matches("a?");//benar, sekali atau 0 kali
"".cocok("a?");//benar
"a".cocok("a?");//benar
"544848154564113".matches("//d{3,100}");//true
//Ini adalah penilaian IP yang paling sederhana, tetapi jika melebihi 255, maka tidak dapat dinilai.
"192.168.0.aaa".cocok("//d{1,3}//.//d{1,3}//.//d{1,3}//d{1,3}" );
"192".pertandingan("[0-2][0-9][0-9]");
4. [abc] berarti mencocokkan karakter apa pun; [^abc] berarti karakter selain abc (masih harus berupa huruf, dan false akan dikembalikan jika berupa string kosong); "[az ]|[AZ]" adalah huruf besar atau kecil tertentu; [AZ&&[ABS]] berarti salah satu huruf besar dan ABS.
Copy kode kodenya sebagai berikut:
//Saya menemukan bahwa tidak ada perbedaan antara |. dan ||, tetapi ada perbedaan antara & dan &&.
System.out.println("C".matches("[AZ&&[ABS]]"));//false
System.out.println("C".matches("[AZ&[ABS]]"));//true
System.out.println("A".matches("[AZ&&[ABS]]"));//true
System.out.println("A".matches("[AZ&[ABS]]"));//true
System.out.println("C".matches("[AZ|[ABS]]"));//true
System.out.println("C".matches("[AZ||[ABS]]"));//true
5. /w karakter kata: [a-zA-Z_0-9] saat mencocokkan nama pengguna; /s karakter kosong: [ /t/n/x0B/f/r]; ] ;/W karakter non-kata: [^/w].
Copy kode kodenya sebagai berikut:
" /n/t/r".cocok("//s{4}");//benar
" ".cocok("//S");//salah
"a_8".cocok("//w{3}");//benar
//"+" berarti sekali atau beberapa kali
"abc888&^%".matches("[az]{1,3}//d+[&^#%]+");//true
/*
*Karakter yang akan dicocokkan hanya berupa backslash saja, namun tidak bisa ditulis "/" lalu digabungkan dengan yang berikut ini",
* Yang sebelumnya "tidak bisa cocok akan menghasilkan CE.
* tidak boleh diikuti dengan "//", jika tidak akan terjadi error runtime (tidak ada masalah dalam kompilasi), harus ditulis "////"
*/
System.out.println("//".matches("////"));//true
6. Kelas karakter POSIX (khusus US-ASCII)
Copy kode kodenya sebagai berikut:
/p{Karakter alfabet huruf kecil: [az] ;/p{Atas} Karakter alfabet huruf besar: [AZ] ;/p{ASCII} Semua ASCII: [/x00-/x7F] ;/p{Alpha} Karakter alfabet: [/p{Lower}/p{Upper}] ;/p{Digit} Bilangan desimal: [0-9].
7. Pencocokan batas
^ Awal baris $ Akhir baris/b Batas kata/B Batas bukan kata/A Awal masukan/G Akhir pertandingan sebelumnya/Z Akhir masukan, hanya digunakan untuk terminator terakhir (jika ada)
/z akhir masukan
Copy kode kodenya sebagai berikut:
"hello world".matches("^h.*");//Awal baris ^
"halo dunia".matches(".*ld$");//Akhir dari $line
"halo dunia".matches("^h[az]{1,3}o//b.*");///bbatas kata
"helloworld".matches("^h[az]{1,3}o//b.*");
" /n".matches("^[//s&&[^//n]]*//n$");//Hakim baris kosong, yang dimulai dengan karakter kosong
8. Anda juga dapat menggunakan m.start() dan m.end() di bawah metode find untuk mengembalikan yang berikutnya antara posisi awal dan posisi akhir; jika tidak dapat ditemukan, kesalahan akan terjadi.
Copy kode kodenya sebagai berikut:
Pola p = Pattern.compile("//d{3,5}");
Tali s = "133-34444-333-00";
Pencocokan m = p.pencocokan;
m.matches();//matches cocok dengan semua string
m.reset();
/*
* Jika metode reset dipanggil terlebih dahulu di bawah ini, outputnya adalah true, true, true, false.
* Jika tidak, pencarian kedua dari belakang juga menghasilkan false.
*Alasannya adalah sebagai berikut:
* cocok dengan "-" pertama dan ternyata tidak cocok, tetapi keempat karakter ini telah dimakan lagi. Pencocokan akan dimulai dari
* 34444 dimulai, dan pencarian kedua dimulai dari 333, karena pencarian cocok dengan urutan berikutnya.
* Metode reset memungkinkan korek api mengeluarkan string yang dimakan korek api.
* Singkatnya: reset harus digunakan antara kecocokan dan penemuan, karena keduanya saling mempengaruhi
*
*/
m.temukan();
m.temukan();
m.find();//Coba temukan urutan masukan berikutnya yang cocok dengan pola ini
m.temukan();
/*
* Mencoba mencocokkan urutan masukan yang dimulai dari awal wilayah dengan pola ini.
* Penulis Thinking in java mengkritik keras metode ini karena tidak jelas dari mana harus memulai pencocokan.
* Semua hal berikut ini benar, karena selalu dimulai dari awal
*/
m.lookingAt();
m.lookingAt();
m.lookingAt();
m.lookingAt();
9. Penggantian senar
Copy kode kodenya sebagai berikut:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
kelas publik TestRegexReplacement {
public static void main(String[] args) {
Pola p = Pattern.compile("java",Pattern.CASE_INSENSITIVE);//Parameter berikut adalah bilangan bulat, yang berarti "tidak peka huruf besar-kecil"
Pencocokan m = p.matcher("Java java hxsyl Ilovejava java JaVaAcmer");
while(m.find()) {
System.out.println(m.group());//m.group akan menampilkan semua Java (mengabaikan huruf besar/kecil)
}
String s = m.replaceAll("Java");//String juga memiliki metode ini
Sistem.keluar.println;
m.reset();//harus ditambahkan karena find dan matcher saling mempengaruhi
StringBuffer sb = StringBuffer baru();
ke dalam saya = 0;
/*
* Cara selanjutnya adalah mengganti bilangan ganjil java yang ditemukan dengan "Java" dan bilangan genap dengan "java"
*/
while(m.find()) {
saya++;
//Tidak dapat ditulis langsung sebagai i&1 dan harus diubah menjadi boolean
jika((i&1)==1) {
m.appendReplacement(sb, "Java");
}kalau tidak {
m.appendReplacement(sb, "java");
}
}
m.appendTail(sb);//Tambahkan string yang tersisa setelah java terakhir ditemukan
System.out.println(sb);//Tanpa reset, hanya Acmer yang keluar
}
}
10. Pengelompokan
Copy kode kodenya sebagai berikut:
/*
*Tambahkan tanda kurung masing-masing, tidak termasuk kurung kurawal terluar, tanda kurung kiri pertama adalah kelompok pertama
*/
Pola p = Pattern.compile("(//d{3,5})([az]{2})");
String s = "123aaa-77878bb-646dd-00";
Pencocokan m = p.pencocokan;
while(m.find()) {
Sistem.keluar.println(m.group());
System.out.println(m.group(1));//Output setiap pasangan angka yang cocok
System.out.println(m.group(2));//Output setiap pasangan huruf yang cocok
}
11. Tangkap email dari halaman web
Copy kode kodenya sebagai berikut:
impor java.io.BufferedReader;
impor java.io.FileNotFoundException;
impor java.io.FileReader;
impor java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* Jika Anda memerlukan metode penggalangan dana, harap berikan nama metodenya terlebih dahulu.
* Kemudian ctrl + 1 mencantumkan rekomendasi dan sistem membuat metode ini
*/
EmailSpider kelas publik {
public static void main(String[] args) {
// TODO Stub metode yang dibuat secara otomatis
mencoba {
BufferedReader br = BufferedReader baru(FileReader baru("F://regex.html"));
Garis string = "";
mencoba {
while((line=br.readLine())!=null) {
memecahkan(garis);
}
} tangkapan (IOException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
} tangkapan (FileNotFoundException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
}
penyelesaian kekosongan statis pribadi (garis string) {
// TODO Stub metode yang dibuat secara otomatis
//Jika ekspresi reguler tidak memenuhi fungsi terkait, ekspresi reguler tidak akan membuat kesalahan karena berupa string.
Pola p = Pattern.compile("[//w[.-]]+@[//w[.-]]+//.[//w]+");
Pencocokan m = p.pencocokan(baris);
while(m.find()) {
Sistem.keluar.println(m.group());
}
}
}
12. Statistik kode
Copy kode kodenya sebagai berikut:
Lihat Kode
/*
* Hitung jumlah baris kosong, baris komentar, dan baris program pada kode
* Bahkan, Anda juga dapat menggunakan startWith dan endWith di String.
* Jika digunakan oleh project manager, perlu juga dihitung apakah jumlah karakter pada setiap baris diakhiri dengan {;
*/
impor java.io.BufferedReader;
impor java.io.File;
impor java.io.FileNotFoundException;
impor java.io.FileReader;
impor java.io.IOException;
kelas publik CoderCount {
garis normal panjang statis = 0;
baris komentar panjang statis = 0;
garis putih panjang statis = 0;
public static void main(String[] args) {
File f = File baru("D://share//src");
File[] codeFiles = f.listFiles();
for(Anak file : codeFiles){
if(anak.getName().matches(".*//.java$")) {
memecahkan(anak);
}
}
System.out.println("Garis normal:" + Garis normal);
System.out.println("garis komentar:" + garis komentar);
System.out.println("Garis putih:" + Garis putih);
}
penyelesaian kekosongan statis pribadi (File f) {
BufferedReader br = nol;
komentar boolean = salah;
mencoba {
br = BufferedReader baru(FileReader baru(f));
Garis string = "";
while((baris = br.readLine()) != null) {
/*
* //Beberapa baris komentar memiliki tab di depannya
* tidak dapat ditulis setelah readLine
* Baris terakhir akan menjadi penunjuk nol
*/
baris = baris.trim();
//readLine menghapus baris baru setelah membaca string.
if(line.matches("^[//s&&[^//n]]*$")) {
garis putih++;
} else if (line.startsWith("/*") && !line.endsWith("*/")) {
baris komentar++;
komentar = benar;
} else if (line.startsWith("/*") && line.endsWith("*/")) {
baris komentar++;
} else if (benar == komentar) {
baris komentar++;
if(line.endsWith("*/")) {
komentar = salah;
}
} else if (line.startsWith("//")) {
baris komentar++;
} kalau tidak {
garis normal++;
}
}
} tangkapan (FileNotFoundException e) {
e.printStackTrace();
} tangkapan (IOException e) {
e.printStackTrace();
} Akhirnya {
jika(br != nol) {
mencoba {
br.close();
br = nol;
} tangkapan (IOException e) {
e.printStackTrace();
}
}
}
}
}
13. Pengukur
termasuk? *+; Defaultnya adalah Serakah, serta Enggan dan Posesif (eksklusif).
Copy kode kodenya sebagai berikut:
//Pengelompokan ditambahkan untuk melihatnya lebih jelas.
Pola p = Pattern.compile("(.{3,10})+[0-9]");
String s = "aaaa5bbbb6";//Panjangnya 10
Pencocokan m = p.pencocokan;
/*
* Sekarang keluaran 0-10, defaultnya adalah Greedy, telan 10 karakter terlebih dahulu, temukan bahwa karakter tersebut tidak cocok, keluarkan satu, dan temukan bahwa karakter tersebut cocok;
* Jika Pattern.compile("(.{3,10}?)+[0-9]") menjadi Reluctant, maka akan menelan tiga karakter terlebih dahulu, menemukan ketidakcocokan, terus menelan hingga cocok, dan menghasilkan output 0 sampai 5;
* Jika Pattern.compile("(.{3,10}++)+[0-9]") bersifat Posesif (eksklusif), ia juga menelan 10 karakter terlebih dahulu, tetapi tidak memuntahkannya, maka tidak akan cocok ,
* Metode ini terutama digunakan jika diperlukan efisiensi tinggi (akan ada kesalahan).
*/
if(m.temukan()) {
Sistem.keluar.println(m.start() + "----" + m.end());
}kalau tidak {
System.put.println("Tidak cocok!");
}
14. Suplemen (kelompok yang tidak menangkap)
Copy kode kodenya sebagai berikut:
//Arti dari kelompok yang tidak menangkap berlawanan dengan arti harafiahnya, yaitu menangkap jika cocok
Pola p = Pattern.compile("(?=a).{3}");
/*
* Output a66, yang setara dengan mengharuskannya dimulai dengan a. Anda juga dapat menulis Pattern.compile("[a].{2}");
* Jika Pattern.compile(".{3}(?!=a)") tidak diakhiri dengan {2}[^a], tetapi karakter berikutnya bukan (lookahead), 44a, 66b akan menjadi output, jadi ini Penggunaan ini tidak umum digunakan;
* Jika Pattern.compile(".{3}(?=a)"), akan menghasilkan 444 (karena ?=a adalah lookahead). , dan jika diletakkan di belakang, tidak termasuk dalam kelompok;
*
*
*/
String s = "444a66b";
Pencocokan m = p.pencocokan;
while(m.find()) {
Sistem.keluar.println(m.group());
}
15. Referensi Belakang
Copy kode kodenya sebagai berikut:
Pola p = Pattern.compile("(//d//d)//1");
/*
*Output true, //1 artinya sama dengan grup pertama, akan salah jika diubah menjadi 1213;
* Jika Pattern.compile("(//d(//d))//2"), perlu diubah menjadi 122.
*
*/
Tali s = "1212";
Pencocokan m = p.pencocokan;
Sistem.keluar.println(m.matches());
16. Singkatan bendera
"." tidak cocok dengan baris baru, ingat saja CASE_INSENSITIVE, singkatan dari "pencocokan tidak peka huruf besar-kecil juga dapat diaktifkan melalui ekspresi flag yang disematkan (?i)".