Apa gunanya metode Pattern.quote?

Saya mencoba memahami Pattern.quote menggunakan kode berikut:

String pattern = Pattern.quote("1252343% 8 567 hdfg gf^$545");
System.out.println("Pattern is : "+pattern);

menghasilkan output:

Pattern is : \Q1252343% 8 567 hdfg gf^$545\E

Apa yang dimaksud dengan \Q dan \E di sini? Deskripsi dokumentasi mengatakan:

Mengembalikan pola literal String untuk String yang ditentukan.

Metode ini menghasilkan String yang dapat digunakan untuk membuat Pattern yang cocok dengan string s seolah-olah itu adalah pola literal.

Metakarakter atau urutan escape dalam urutan masukan tidak akan diberi arti khusus.

Namun tipe pengembalian Pattern.quote adalah String dan bukan objek Pattern yang dikompilasi.

Mengapa metode ini diperlukan dan apa saja contoh penggunaannya?


person Prateek    schedule 14.03.2013    source sumber


Jawaban (6)


\Q berarti awal dari teks literal (yaitu kutipan terbuka regex)
\E berarti akhir dari teks literal (yaitu kutipan dekat regex)

Memanggil metode Pattern.quote() akan membungkus string dalam \Q...\E, yang mengubah teks menjadi regex literal. Misalnya, Pattern.quote(".*") akan cocok dengan sebuah titik dan kemudian sebuah tanda bintang:

System.out.println("foo".matches(".*")); // true
System.out.println("foo".matches(Pattern.quote(".*"))); // false
System.out.println(".*".matches(Pattern.quote(".*"))); // true

Tujuan metode ini adalah untuk tidak mengharuskan programmer mengingat istilah khusus \Q dan \E dan untuk menambahkan sedikit keterbacaan pada kode - regex sudah cukup sulit untuk dibaca. Membandingkan:

someString.matches(Pattern.quote(someLiteral));
someString.matches("\\Q" + someLiteral + "\\E"));

Mengacu pada javadoc:

Mengembalikan pola literal String untuk String yang ditentukan.

Metode ini menghasilkan sebuah String yang dapat digunakan untuk membuat Pola yang cocok dengan string s seolah-olah itu adalah pola literal.

Metakarakter atau urutan escape dalam urutan masukan tidak akan diberi arti khusus.

person Bohemian♦    schedule 14.03.2013
comment
Persamaan yang benar untuk someString.matches(Pattern.quote(someLiteral)) sebenarnya adalah someString.matches("\\Q" + someLiteral.replace("\\E", "\\E\\\\E\\Q") + "\\E") - person kbolino; 16.05.2016
comment
@kbolino Rofl. Dan bagaimana dengan mengganti \\Q? - person Andrew; 23.10.2017
comment
@Andrew Ini menanganinya juga: "\\Q\\E".matches(Pattern.quote("\\Q\\E")) // true. - person Bohemian♦; 23.10.2017
comment
Nein: \\Q menjadi \\Q\\Q\\E, bukan? - person Andrew; 23.10.2017
comment
@Andrew ya, tapi regex cukup pintar untuk mengetahui cara menanganinya: Teks yang dikutip adalah segalanya mulai dari \Q (eksklusif) hingga \E berikutnya (eksklusif), yang dapat mencakup sejumlah \Q urutan. - person Bohemian♦; 23.10.2017

Metode Pattern.quote mengutip bagian dari pola regex untuk membuat regex menafsirkannya sebagai string literal.

Katakanlah Anda memiliki beberapa masukan pengguna dalam program pencarian Anda, dan Anda ingin melakukan regex untuk itu. Namun masukan ini mungkin memiliki karakter yang tidak aman sehingga dapat Anda gunakan

Pattern pattern = Pattern.compile(Pattern.quote(userInput));

Metode ini tidak mengutip Pattern tetapi, seperti yang Anda tunjukkan, membungkus String dalam tanda kutip regex.

person Boris the Spider    schedule 14.03.2013

\Q dan \E, antara lain, didokumentasikan secara menyeluruh di java.util .regex.Pattern halaman Javadoc. Artinya "mulai Quote", "End quote" dan menandai wilayah di mana semua karakter memiliki arti literal. Cara menggunakan pengembalian Pattern.quote adalah dengan memasukkannya ke Pattern.compile, atau metode lain apa pun yang menerima string pola, seperti String.split.

person Marko Topolnik    schedule 14.03.2013

Jika Anda mengkompilasi String yang dikembalikan oleh Pattern.quote, Anda akan mendapatkan Pattern yang cocok dengan string literal yang Anda quoted.

\Q dan \E menandai awal dan akhir bagian string yang dikutip.

person OpenSauce    schedule 14.03.2013

Regex sering bertabrakan dengan string normal. Katakanlah saya ingin regex mencari string tertentu yang hanya diketahui saat runtime. Bagaimana kita bisa yakin bahwa string tersebut tidak memiliki arti regex misalnya (".*.*.*")? Kami mengutipnya.

person spender    schedule 14.03.2013
comment
Memang benar, salah satu contohnya adalah ketika Anda ingin mengganti kemunculan pertama suatu substring, tetapi String.replaceFirst menggunakan regex, ketika Anda ingin meneruskan string literal. - person Klitos Kyriacou; 13.04.2015

Metode ini digunakan untuk membuat pola diperlakukan sebagai rangkaian karakter literal. Ini memiliki efek yang sama seperti tanda PATTERN.LITERAL.

person logbasex    schedule 02.04.2020