Java matchesmenempatkan ^ di awal dan $ di akhir regex untuk Anda. Jadi matches("[a-z]")sebenarnya akan mencari / ^ [az] $ / sebagai gantinya.
Robino
Ya, @Robino Anda memang benar.
Mihir
1
Tentunya, jika Anda berharap matchesuntuk mencari kejadian [a-z], maka itu harus cocok dengan mereka semua? Saya tidak akan berharap matchesuntuk memeriksa setiap karakter secara individual terhadap regex.
PhilHibbs
@Robino: Di manakah fungsionalitas itu dijelaskan / didokumentasikan?
Toru
@ Toru Di halaman java docs untuk String.Matches - di mana lagi? Google biasa "dokumentasi string java cocok" mengungkapkan, di hasil atas, frasa "str.matches (regex) menghasilkan hasil yang persis sama dengan ekspresi". Kata yang penting adalah "tepat".
Robino
Jawaban:
323
Selamat datang di .matches()metode Java yang salah nama ... Mencoba dan cocok dengan SEMUA input. Sayangnya, bahasa lain mengikuti :(
Jika Anda ingin melihat apakah regex cocok dengan teks input, gunakan a Pattern, a Matcherdan .find()metode korek api :
Pattern p =Pattern.compile("[a-z]");Matcher m = p.matcher(inputstring);if(m.find())// match
Jika yang Anda inginkan adalah untuk melihat apakah input hanya memiliki huruf kecil, Anda dapat menggunakan .matches(), tetapi Anda harus mencocokkan satu atau lebih karakter: tambahkan a +ke kelas karakter Anda, seperti pada [a-z]+. Atau gunakan ^[a-z]+$dan .find().
saya menemukan 100-an tutorial online tidak lengkap. Tidak dapat menemukan yang bagus. Apakah Anda punya saran?
John
Thanx @fge untuk menjelaskan .matches(). Mungkin Anda tahu mengapa .find()kerjanya sangat lambat dalam contoh ini ?
Konstantin Konopko
3
Apa yang Anda maksud dengan bahasa lain yang mengikuti ? Dari yang saya tahu, hanya C ++ yang memiliki seperangkat metode - regex_searchdan regex_match. Dalam Python, re.matchhanya jangkar yang cocok di awal string (seolah-olah itu \Apattern) dan Python 3.x telah mendapatkan .fullmatch()metode yang bagus . Di JS, Go, PHP, dan .NET, tidak ada metode regex yang mengaitkan pertandingan secara implisit. ElasticSearch, Schema XML dan HTML5 / Validators Pola Angluar selalu berlabuh secara default. Di Swift / Objective C, ada cara untuk menahan pola di awal dengan sebuah opsi.
Wiktor Stribiżew
Apakah ada cara oneliner untuk melakukan ini?
Cardinal - Reinstate Monica
44
[a-z]cocok dengan satu char antara a dan z. Jadi, jika string Anda hanya "d", misalnya, maka itu akan cocok dan dicetak.
Anda perlu mengubah regex Anda [a-z]+agar cocok dengan satu atau lebih karakter.
Tentu saja itu cocok dengan satu char, itulah yang regexp lakukan! Namun yang tidak jelas (dan tidak seharusnya demikian!) Adalah bahwa java menempatkan awalan ^dan akhiran di $sekitar regexp yang disediakan, mengubahnya secara tidak diinginkan dan membuat bug aneh. Mereka seharusnya tidak melakukan itu, karena bukan itu maksud regexp awal.
klaar
28
String.matchesmengembalikan apakah seluruh string cocok dengan regex, bukan sembarang substring.
matches
menempatkan ^ di awal dan $ di akhir regex untuk Anda. Jadimatches("[a-z]")
sebenarnya akan mencari / ^ [az] $ / sebagai gantinya.matches
untuk mencari kejadian[a-z]
, maka itu harus cocok dengan mereka semua? Saya tidak akan berharapmatches
untuk memeriksa setiap karakter secara individual terhadap regex.Jawaban:
Selamat datang di
.matches()
metode Java yang salah nama ... Mencoba dan cocok dengan SEMUA input. Sayangnya, bahasa lain mengikuti :(Jika Anda ingin melihat apakah regex cocok dengan teks input, gunakan a
Pattern
, aMatcher
dan.find()
metode korek api :Jika yang Anda inginkan adalah untuk melihat apakah input hanya memiliki huruf kecil, Anda dapat menggunakan
.matches()
, tetapi Anda harus mencocokkan satu atau lebih karakter: tambahkan a+
ke kelas karakter Anda, seperti pada[a-z]+
. Atau gunakan^[a-z]+$
dan.find()
.sumber
.matches()
. Mungkin Anda tahu mengapa.find()
kerjanya sangat lambat dalam contoh ini ?regex_search
danregex_match
. Dalam Python,re.match
hanya jangkar yang cocok di awal string (seolah-olah itu\Apattern
) dan Python 3.x telah mendapatkan.fullmatch()
metode yang bagus . Di JS, Go, PHP, dan .NET, tidak ada metode regex yang mengaitkan pertandingan secara implisit. ElasticSearch, Schema XML dan HTML5 / Validators Pola Angluar selalu berlabuh secara default. Di Swift / Objective C, ada cara untuk menahan pola di awal dengan sebuah opsi.[a-z]
cocok dengan satu char antara a dan z. Jadi, jika string Anda hanya"d"
, misalnya, maka itu akan cocok dan dicetak.Anda perlu mengubah regex Anda
[a-z]+
agar cocok dengan satu atau lebih karakter.sumber
^
dan akhiran di$
sekitar regexp yang disediakan, mengubahnya secara tidak diinginkan dan membuat bug aneh. Mereka seharusnya tidak melakukan itu, karena bukan itu maksud regexp awal.String.matches
mengembalikan apakah seluruh string cocok dengan regex, bukan sembarang substring.sumber
Implementasi java dari regex mencoba untuk mencocokkan keseluruhan string
itu berbeda dari perl regex, yang mencoba menemukan bagian yang cocok
jika Anda ingin menemukan string dengan karakter huruf kecil, gunakan pola
[a-z]+
jika Anda ingin menemukan string yang mengandung setidaknya satu karakter huruf kecil, gunakan pola
.*[a-z].*
sumber
Bekas
sumber
Saya pernah menghadapi masalah yang sama:
Di atas gagal!
Di atas bekerja dengan pola di dalam
(
dan)
.sumber
Ekspresi reguler Anda
[a-z]
tidak cocokdkoe
karena hanya cocok dengan string panjang 1. Gunakan sesuatu seperti[a-z]+
.sumber
Anda harus memasukkan setidaknya satu tangkapan
()
dalam pola untuk dicocokkan, dan memperbaiki pola seperti ini:sumber
matches
tidak memiliki output.Anda dapat membuat pola huruf Anda tidak sensitif dengan melakukan:
sumber