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
, ...)
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:
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\\.
Solusi yang diajukan oleh anggota lain tidak bekerja untuk saya.
Tetapi saya menemukan ini:
untuk menghindari titik di regexp menulis java [.]
\\.
tidak bekerja untuk saya: \.
mengeluh bahwa .
tidak perlu melarikan diri, \\.
membuatnya berpikir itu \.
bukan .
, \\\.
dan pembangun melemparkan kesalahan, [.]
adalah satu-satunya hal yang berhasil.
\\.
di dalam string literal memberi Anda \.
yang dibutuhkan regex untuk melihat titik sebagai titik literal alih-alih pencocokan karakter apa pun.
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 egrep
dalamnya 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
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.
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.
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.
"\\.\\*$"
. Tidak perlu mencocokkan awal string jika itu tidak masalah bagi Anda.
Jika Anda ingin mengakhiri memeriksa apakah kalimat Anda diakhiri dengan ". " Maka Anda harus menambahkan [\. \ ] $ Ke bagian akhir pola Anda.