Latest web development tutorials

ekspresi reguler Java

ekspresi reguler mendefinisikan string pola.

ekspresi reguler dapat digunakan untuk mencari, mengedit, atau pengolahan teks.

Ekspresi reguler tidak terbatas pada bahasa tertentu, tetapi ada perbedaan yang halus dalam setiap bahasa.

Java ekspresi reguler dan Perl adalah yang paling mirip.

java.util.regex paket termasuk tiga kategori berikut:

  • kategori pola:

    pola objek adalah representasi ekspresi compiler biasa. kelas pola tidak memiliki konstruktor publik. Untuk membuat objek Pola, Anda harus terlebih dahulu memanggil metode kompilasi nya public static yang mengembalikan objek Pola. Metode ini mengambil ekspresi reguler sebagai argumen pertama.

  • kategori pencocok:

    objek pencocok interpretasi string masukan dan operasi pencocokan mesin. Seperti kelas Pola, matcher tidak memiliki konstruktor publik. Anda perlu memanggil metode objek Pola matcher untuk mendapatkan objek Matcher.

  • PatternSyntaxException:

    PatternSyntaxException adalah kelas pengecualian non-wajib yang mewakili biasa kesalahan sintaks pola ekspresi.


capture kelompok

kelompok menangkap beberapa karakter ketika metode pengobatan kesatuan, melalui karakter dikelompokkan dalam tanda kurung untuk membuat.

Sebagai contoh, ekspresi reguler (anjing) membuat satu kelompok, kelompok yang berisi "d", "o", dan "g".

Capture kelompok dengan menghitung kurung terbuka bernomor dari kiri ke kanan. Misalnya, dalam ekspresi ((A) (B (C))), ada empat kelompok seperti:

  • ((A) (B (C)))
  • (A)
  • (B (C))
  • (C)

Dengan memanggil matcher objek groupCount cara untuk melihat berapa banyak paket ekspresi. Metode groupCount mengembalikan sebuah int mewakili objek matcher saat ini memiliki beberapa kelompok capture.

Ada kelompok khusus (kelompok 0), selalu mewakili seluruh ekspresi. Kelompok ini tidak termasuk dalam nilai kembali groupCount.

contoh

Contoh berikut menunjukkan bagaimana menemukan sejumlah nomor dari string yang diberikan:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    public static void main( String args[] ){

      // 按指定模式在字符串查找
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(.*)(\\d+)(.*)";

      // 创建 Pattern 对象
      Pattern r = Pattern.compile(pattern);

      // 现在创建 matcher 对象
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
      } else {
         System.out.println("NO MATCH");
      }
   }
}

Contoh di atas hasil disusun adalah sebagai berikut:

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0

sintaks ekspresi reguler

karakter

penjelasan

\

Karakter berikutnya ditandai sebagai karakter khusus, teks, back-referensi atau oktal melarikan diri. Misalnya, "n" cocok dengan karakter "n". "\ N" cocok dengan karakter baris baru. Urutan "\\" pertandingan "\", "\ (" Match "(."

^

Cocok dengan string input dimulai. Jika Anda mengaturMultiline RegExpproperti posisi objek yang cocok dan juga ^ "\ n" atau "\ r" setelah.

$

Mencocokkan akhir masukan dari posisi tali. Jika propertiMultiline objek RegExpini, $ juga cocok dengan "\ n" atau posisi "\ r" sebelumnya.

*

Nol atau lebih kali cocok dengan karakter atau sub-ekspresi. Misalnya, zo * cocok "z" dan "kebun binatang". * Setara dengan {0,}.

+

Satu kali atau lebih cocok dengan karakter atau sub-ekspresi. Misalnya, "zo +" dan "zo" dan "kebun binatang" pertandingan, tetapi "z" tidak cocok. + Apakah setara dengan {1}.

?

Nol atau satu cocok dengan karakter atau sub-ekspresi. Misalnya, "lakukan (es)?" Cocok dengan "melakukan" atau "tidak" dalam "melakukan". ? Setara dengan {0,1}.

{N}

nbilangan bulat non-negatif. Sama persisnkali. Misalnya, "o {2}" dan "Bob" di "o" tidak cocok, tapi "makanan" dari dua "o" pertandingan.

{N,}

nbilangan bulat non-negatif. Pertandingan setidaknyankali. Misalnya, "o {2,}" tidak cocok dengan "Bob" di "o", dan pertandingan "foooood" semua o. "O {1,}" setara dengan "o +". "O {0,}" setara dengan "o *".

{N,m}

Mdan integern non-negatif,di manan<= m. Pertandingan setidaknyan danpaling kalim.Misalnya, "o {1,3}" pertandingan "fooooood" di tiga o pertama. 'O {0,1}' setara dengan 'o?'. Catatan: Anda tidak dapat memasukkan spasi antara koma dan angka.

?

Ketika karakter diikuti dalam kualifikasi lainnya (*, +,?, { N}, {n,}, {n, m}) kemudian, pola yang cocok adalah "non-serakah." "Non-serakah" pencocokan pola untuk mencari kemungkinan tali pendek, dan default pola "serakah" yang cocok untuk mencari kemungkinan string panjang. Misalnya, dalam string "oooo" di, "o +?" Cocok hanya satu "o", dan "o +" cocok dengan semua "o".

.

Cocok dengan satu karakter apapun kecuali "\ r \ n" adalah. Untuk mencocokkan antara "\ r \ n", termasuk salah satu karakter, seperti pola penggunaan "[\ s \ S]" atau sejenisnya.

(Pola)

Polapencocokan dan menangkap subexpression pertandingan. Anda dapat menggunakan$ 0 ... $ 9 properti sesuai hasil dari "cocok" koleksi untuk mengambil ditangkap.Untuk mencocokkan tanda kurung karakter (), menggunakan "\ (" atau "\)."

(:?Pola)

Pencocokanpolatetapi tidak menangkap subexpression pertandingan itu adalah pertandingan non-menangkap, pencocokan tidak disimpan untuk digunakan nanti. Ini adalah untuk digunakan "atau" karakter (|) ketika komponen modus kombinasi yang berguna. Misalnya, 'industr (:? Y | ies) adalah rasio' industri | ekspresi yang lebih ekonomis industri '.

(?= Pola)

Pertunjukan maju prediksi subexpression pencarian string string pencocokanpolapertama di titik awal dari pencocokan ekspresi. Ini adalah pertandingan non-menangkap, yang tidak menangkap pertandingan untuk digunakan nanti. Misalnya, 'jendela (= 95 |? 98 | NT | 2000)' Matching "Windows 2000" "Windows", tapi tidak cocok dengan "Windows 3.1" di "Windows". Lookahead tidak mengambil karakter, setelah pertandingan terjadi, pertandingan berikutnya untuk pencarian Anda segera setelah pertandingan terakhir, tidak setelah perkiraan pertama dalam komposisi karakter.

(?!Pola)

Lookahead subexpression melakukan pencarian reverse, ekspresi tidak cocok denganpolastring yang cocok di titik awal dari string pencarian. Ini adalah pertandingan non-menangkap, yang tidak menangkap pertandingan untuk digunakan nanti. Misalnya, 'Windows (95 | ?! 98 | NT | 2000)' cocok dengan "Windows 3.1" di "Windows", tapi tidak cocok dengan "Windows 2000" "Windows". Lookahead tidak mengambil karakter, setelah pertandingan terjadi, pertandingan berikutnya untuk pencarian Anda segera setelah pertandingan terakhir, tidak setelah perkiraan pertama dalam komposisi karakter.

x|y

Pertandinganxatauy.Misalnya, 'z | makanan' cocok "z" atau "makanan". '(Z | f) banjir' match "zood" atau "makanan".

[Xyz]

Set karakter. Cocok karakter apapun termasuk. Misalnya, "[abc]" cocok "polos" di "a".

[^Xyz]

set karakter sebaliknya. Cocok karakter apapun tidak disertakan. Misalnya, "[^ abc]" cocok "polos" di "p", "l", "i", "n".

[Az]

Berbagai karakter. Sama pada setiap karakter dalam kisaran tertentu. Misalnya, "[az]" pertandingan "a" untuk setiap huruf kecil di kisaran "z".

[^Az]

Kisaran kebalikan dari karakter. Cocok karakter apapun tidak dalam kisaran tertentu. Misalnya, "[^ az]" cocok apapun tidak "a" untuk salah satu karakter dalam kisaran "z".

\ B

Cocok batas kata, yaitu, posisi kata dan ruang antara. Misalnya, "er \ b" cocok "tidak pernah" di "er", tapi tidak cocok dengan "kata kerja" di "er".

\ B

Mencocokkan batas non-kata. "Er \ B" sesuai dengan "kata kerja" di "er", tapi tidak cocok "tidak pernah" di "er".

\C x

karakter kontrol pertandingan ditandai denganx.Misalnya, \ cM cocok Control-M atau carriage return.Nilai xharus antara AZ atau az. Jika tidak, diasumsikan bahwa c adalah "c" karakter itu sendiri.

\ D

Pencocokan karakter numerik. Setara dengan [0-9].

\ D

Mencocokkan karakter non-numerik. Hal ini setara dengan [^ 0-9].

\ F

pertandingan FormFeed. Setara dengan \ x0c dan \ cL.

\ N

Cocok baris baru. Setara dengan \ x0a dan \ Cj.

\ R

Cocok carriage return. Setara dengan \ X0D dan \ cM.

\ S

Cocok karakter spasi, termasuk spasi, tab, page break, dll Setara dengan [\ f \ n \ r \ t \ v].

\ S

Cocok karakter non-spasi. Setara dengan [^ \ f \ n \ r \ t \ v].

\ T

tab pertandingan. Dan \ x09 dan \ ci setara.

\ V

Cocok dengan karakter tab vertikal. Dan \ x0b dan \ cK setara.

\ W

Cocok dengan karakter karakter kelas, termasuk garis bawah. Dan "[A-Za-Z0-9_]" setara.

\ W

Cocok dengan karakter non-kata. Dan "[^ A-Za-Z0-9_]" setara.

\X n

Pertandingann,n di sini adalah kode melarikan diri heksadesimal. kode escape heksadesimal harus tepat dua digit. Misalnya, "\ X41" cocok "A". "\ X041" dan "\ X04" & "1" yang setara. Memungkinkan penggunaan rutin kode ekspresi ASCII.

\Bil

Pertandingannum,num di sini adalah bilangan bulat positif. Untuk menangkap pencocokan backreferences. Misalnya, "(.) \ 1" cocok dua karakter yang identik berturut-turut.

\N

Mengidentifikasi kode escape oktal atau back-referensi. Jika \ndidahului oleh subexpressions setidaknyanditangkap, makanadalah backreference. Jika tidak, jikanadalah bilangan oktal (0-7), makanadalah kode melarikan diri oktal.

\Nm

Mengidentifikasi kode escape oktal atau back-referensi. Jika \nmdi depan setidaknyanmcapture subexpression, makanmadalah backreference. Jika \nmsetidaknya didepan ncapture,nadalah backreference, diikuti oleh karakterm.Jika dua kasus sebelumnya tidak hadir,\nm cocok dengan nilai oktalnm,di manandanmadalah oktal digit (0-7).

\ NML

Ketikanadalah bilangan oktal(0-3),m danladalah oktal (0-7), cocok kode melarikan diri oktalNML.

\U n

Cocokn,di mananadalah karakter Unicode diwakili oleh empat angka heksadesimal. Misalnya, \ u00A9 cocok dengan simbol hak cipta (©).

metode kelas Matcher

Metode indeks

metode indeks memberikan nilai indeks berguna menunjukkan tepat di mana untuk menemukan pertandingan string input:

Tidak. Metode dan Deskripsi
1 public int start ()
Mengembalikan index awal dari pertandingan sebelumnya.
2 public int start (kelompok int)
Kembali beroperasi selama pertandingan sebelumnya, ditangkap oleh sekelompok tertentu indeks awal sub-urutan
3 public int end ()
Mengembalikan offset setelah karakter terakhir cocok.
4 public int akhir (kelompok int)
Kembali beroperasi selama pertandingan sebelumnya, oleh mengingat diimbangi setelah kelompok terakhir dari karakter setelah urutan capture.

Metode penelitian

Metode yang digunakan untuk memeriksa input string dan mengembalikan nilai Boolean yang menunjukkan apakah atau tidak pola ditemukan:

Tidak. Metode dan Deskripsi
1 publik lookingat boolean ()
Coba daerah dari awal awal urutan masukan sesuai pola.
2 public boolean find ()
Cobalah untuk menemukan urutan masukan yang cocok dengan pola urutan berikutnya.
3 public boolean find (int start)
Ulang matcher ini dan kemudian mencoba untuk menemukan cocok untuk pola, masukkan sub-urutan berikutnya dimulai dari indeks tertentu.
4 pertandingan public boolean ()
Coba seluruh wilayah dan pola yang cocok.

metode pengganti

Alternatif adalah untuk mengganti string dalam metode input teks:

Tidak. Metode dan Deskripsi
1 publik Matcher appendReplacement (StringBuffer sb, String pengganti)
Untuk mencapai penambahan non-terminal dan substitusi langkah.
2 publik StringBuffer appendTail (StringBuffer sb)
Mencapai penambahan terminal dan substitusi langkah.
3 public String replaceAll (pengganti String)
modus ganti dengan string pengganti yang diberikan sesuai dengan urutan masukan untuk setiap urutan.
4 public String replaceFirst (pengganti String)
modus ganti dengan string pengganti yang diberikan cocok dengan urutan input dari sub-urutan pertama.
5 public static String quoteReplacement (String s)
Mengembalikan string string pengganti literal. Metode ini mengembalikan string yang dilewatkan sebagai metode untuk bekerja kelas appendReplacement Matcher sebagai string literal.

mulai dan metode akhir

Berikut adalah contoh dari jumlah kejadian dalam string masukan untuk menghitung kata "kucing" muncul:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static final String REGEX = "\\bcat\\b";
    private static final String INPUT =
                                    "cat cat cat cattie cat";

    public static void main( String args[] ){
       Pattern p = Pattern.compile(REGEX);
       Matcher m = p.matcher(INPUT); // 获取 matcher 对象
       int count = 0;

       while(m.find()) {
         count++;
         System.out.println("Match number "+count);
         System.out.println("start(): "+m.start());
         System.out.println("end(): "+m.end());
      }
   }
}

Contoh di atas hasil disusun adalah sebagai berikut:

Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22

Hal ini dapat dilihat dengan menggunakan contoh batas kata, untuk memastikan bahwa huruf "c" "a" "t" bukan hanya substring kata yang panjang. Hal ini juga memberikan beberapa informasi yang berguna tentang string input posisi cocok.

Metode awal mengembalikan operasi selama pertandingan sebelumnya, dari indeks yang diberikan kelompok ditangkap setelah tanggal neraca awal, mengakhiri metode pencocokan indeks terakhir ditambah satu karakter.

pertandingan dan metode lookingat

pertandingan dan metode lookingat digunakan untuk mencoba untuk mencocokkan urutan pola input. Mereka berbeda dari persyaratan seluruh pertandingan urutan matcher, tapi lookingat tidak diperlukan.

Kedua metode yang sering digunakan dalam input string dimulai.

Melalui contoh berikut untuk menjelaskan fitur ini:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static final String REGEX = "foo";
    private static final String INPUT = "fooooooooooooooooo";
    private static Pattern pattern;
    private static Matcher matcher;

    public static void main( String args[] ){
       pattern = Pattern.compile(REGEX);
       matcher = pattern.matcher(INPUT);

       System.out.println("Current REGEX is: "+REGEX);
       System.out.println("Current INPUT is: "+INPUT);

       System.out.println("lookingAt(): "+matcher.lookingAt());
       System.out.println("matches(): "+matcher.matches());
   }
}

Contoh di atas hasil disusun adalah sebagai berikut:

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false

metode replaceFirst dan replaceAll

Metode replaceFirst dan replaceAll digunakan untuk menggantikan pencocokan teks ekspresi reguler. Perbedaannya adalah, replaceFirst menggantikan pertandingan pertama, replaceAll mengganti semua pertandingan.

Contoh berikut untuk menjelaskan fitur ini:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static String REGEX = "dog";
    private static String INPUT = "The dog says meow. " +
                                    "All dogs say meow.";
    private static String REPLACE = "cat";

    public static void main(String[] args) {
       Pattern p = Pattern.compile(REGEX);
       // get a matcher object
       Matcher m = p.matcher(INPUT); 
       INPUT = m.replaceAll(REPLACE);
       System.out.println(INPUT);
   }
}

Contoh di atas hasil disusun adalah sebagai berikut:

The cat says meow. All cats say meow.

metode appendReplacement dan appendTail

kelas matcher juga menyediakan metode untuk appendTail appendReplacement dan mengganti teks:

Lihatlah contoh berikut untuk menjelaskan fitur ini:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
   private static String REGEX = "a*b";
   private static String INPUT = "aabfooaabfooabfoob";
   private static String REPLACE = "-";
   public static void main(String[] args) {
      Pattern p = Pattern.compile(REGEX);
      // 获取 matcher 对象
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      while(m.find()){
         m.appendReplacement(sb,REPLACE);
      }
      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

Contoh di atas hasil disusun adalah sebagai berikut:

-foo-foo-foo-

metode kelas PatternSyntaxException

PatternSyntaxException adalah kelas pengecualian non-wajib, yang menunjukkan biasa kesalahan sintaks pola ekspresi.

kelas PatternSyntaxException memberikan metode berikut untuk membantu kita melihat apa yang telah terjadi kesalahan.

Tidak. Metode dan Deskripsi
1 public String getDescription ()
Dapatkan deskripsi kesalahan.
2 public int getIndex ()
Dapatkan indeks yang salah.
3 public String getPattern ()
Dapatkan pola ekspresi reguler yang salah.
4 public String getMessage ()
Mengembalikan string multi-baris yang berisi deskripsi dari kesalahan sintaks dan indeks, indikasi visual dari pola ekspresi reguler yang keliru, dan indeks kesalahan.