Java RegEx karakter meta (.) Dan titik biasa?


150

Di Java RegEx, cara mengetahui perbedaan antara .(titik) karakter meta dan titik normal seperti yang kita gunakan dalam kalimat apa pun. Bagaimana menangani situasi seperti ini untuk karakter meta lain juga suka ( *,+ , \d, ...)

Jawaban:


276

Jika Anda ingin titik atau karakter lain dengan makna khusus dalam regex menjadi karakter normal, Anda harus menghindarinya dengan garis miring terbalik. Karena regex di Jawa adalah string Java yang normal, Anda harus lolos dari backslash itu sendiri, jadi Anda perlu dua backslash misalnya\\.


1
perbaikan ini juga berlaku untuk bash
krivar

18
Perlu diketahui bahwa apakah akan lolos dari backslash tergantung pada bagaimana Anda memasok regex. jika hardcoded Anda perlu menggunakan: "\\." , jika membaca dari sumber mentah (mis. file teks) Anda hanya menggunakan satu garis miring terbalik: \.
Paul

25

Solusi yang diajukan oleh anggota lain tidak bekerja untuk saya.

Tetapi saya menemukan ini:

untuk menghindari titik di regexp menulis java [.]


2
Sama, \\.tidak bekerja untuk saya: \.mengeluh bahwa .tidak perlu melarikan diri, \\.membuatnya berpikir itu \.bukan ., \\\.dan pembangun melemparkan kesalahan, [.]adalah satu-satunya hal yang berhasil.
mithunc

1
@mithunc Aneh, \\.di dalam string literal memberi Anda \.yang dibutuhkan regex untuk melihat titik sebagai titik literal alih-alih pencocokan karakter apa pun.
klaar

16

Ekspresi reguler gaya-perl (yang mendasari mesin regex Java memperlakukan) karakter berikut sebagai karakter khusus:

.^$|*+?()[{\memiliki makna khusus di luar kelas karakter,

]^-\memiliki makna khusus di dalam kelas karakter ( [...]).

Jadi, Anda perlu keluar dari simbol-simbol (dan hanya itu) tergantung pada konteks (atau, dalam kasus kelas karakter, letakkan di posisi di mana mereka tidak dapat disalahartikan).

Tidak perlu melarikan diri dari karakter lain mungkin berhasil, tetapi beberapa mesin regex akan memperlakukan ini sebagai kesalahan sintaks, misalnya \_akan menyebabkan kesalahan dalam .NET.

Beberapa yang lain akan mengarah pada hasil yang salah, misalnya \<ditafsirkan sebagai literal <dalam Perl, tetapi di egrepdalamnya berarti "batas kata".

Jadi tulis -?\d+\.\d+\$untuk mencocokkan 1.50$, -2.00$dll. Dan [(){}[\]]untuk kelas karakter yang cocok dengan semua jenis kurung / kurung / kurung.

Jika Anda perlu mengubah string input pengguna menjadi bentuk aman-regex, gunakan java.util.regex.Pattern.quote.

Bacaan lebih lanjut: Blog Jan Goyvaert, RegexGuru tentang melarikan diri dari karakter meta


4

Melarikan diri karakter khusus dengan backslash. \., \*, \+, \\d, Dan sebagainya. Jika Anda tidak yakin, Anda dapat keluar dari karakter non-alfabet baik khusus atau tidak. Lihat javadoc untuk java.util.regex.Pattern untuk informasi lebih lanjut.


Melarikan diri dari karakter yang tidak spesial mungkin berguna dalam beberapa bahasa tetapi mungkin gagal dalam yang lain, jadi lebih baik untuk tidak membiasakan diri.
Tim Pietzcker

1
Pertanyaan ini secara khusus tentang Java, dan docs.oracle.com/javase/6/docs/api/java/util/regex/… mengatakan "Backslash dapat digunakan sebelum karakter non-alfabet terlepas dari apakah karakter itu adalah bagian dari konstruksi yang tidak terhindar. "
Christoffer Hammarström

2

Ini kode yang bisa langsung Anda salin tempel:

String imageName = "picture1.jpg";
String [] imageNameArray = imageName.split("\\.");
for(int i =0; i< imageNameArray.length ; i++)
{
   system.out.println(imageNameArray[i]);
}

Dan bagaimana jika secara keliru ada ruang yang tersisa sebelum atau sesudah "." dalam kasus seperti ini? Itu selalu praktik terbaik untuk mempertimbangkan ruang-ruang itu juga.

String imageName = "picture1  . jpg";
String [] imageNameArray = imageName.split("\\s*.\\s*");
    for(int i =0; i< imageNameArray.length ; i++)
    {
       system.out.println(imageNameArray[i]);
    }

Di sini, \\ s * ada di sana untuk mempertimbangkan spasi dan memberi Anda hanya string yang diperlukan terpecah.


1

Saya ingin mencocokkan string yang diakhiri dengan ". *" Untuk ini saya harus menggunakan yang berikut:

"^.*\\.\\*$"

Agak konyol jika Anda memikirkannya: D Inilah artinya. Pada awal string dapat ada karakter nol atau lebih banyak yang diikuti oleh titik "." diikuti oleh bintang (*) di akhir string.

Saya harap ini berguna bagi seseorang. Terima kasih atas hal backslash untuk Fabian.


Cukup gunakan saja "\\.\\*$". Tidak perlu mencocokkan awal string jika itu tidak masalah bagi Anda.
Ophidian

Ya kamu benar. Sejujurnya, saya tidak dapat mengingat use case untuk ini: /
Atspulgs

Tidak benar-benar membantu Anda tetapi membantu orang lain melihat posting Anda: P
Ophidian

0

Jika Anda ingin mengakhiri memeriksa apakah kalimat Anda diakhiri dengan ". " Maka Anda harus menambahkan [\. \ ] $ Ke bagian akhir pola Anda.


0

Saya sedang melakukan beberapa array dasar di JGrasp dan menemukan bahwa dengan metode accessor untuk array char [] [] menggunakan ('.') Untuk menempatkan satu titik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.