Saya memiliki kode ini, dan saya ingin tahu, apakah saya hanya dapat mengganti grup (tidak semua pola) di regex Java. Kode:
//...
Pattern p = Pattern.compile("(\\d).*(\\d)");
String input = "6 example input 4";
Matcher m = p.matcher(input);
if (m.find()) {
//Now I want replace group one ( (\\d) ) with number
//and group two (too (\\d) ) with 1, but I don't know how.
}
java
regex
replace
regex-group
wokena
sumber
sumber
Jawaban:
Gunakan
$n
(di mana n adalah digit) untuk merujuk ke bagian selanjutnya yang diambilreplaceFirst(...)
. Saya berasumsi Anda ingin mengganti grup pertama dengan string literal "number" dan grup kedua dengan nilai grup pertama.Pertimbangkan
(\D+)
untuk kelompok kedua, bukan(.*)
.*
adalah pencocokkan yang rakus, dan akan mengonsumsi digit terakhir pada awalnya. Pencocokan kemudian harus mundur ketika menyadari final(\d)
tidak ada yang cocok, sebelum bisa cocok dengan digit terakhir.sumber
m.replaceFirst("number $2$1");
harusm.replaceFirst("number $3$1");
Anda dapat menggunakan
Matcher#start(group)
danMatcher#end(group)
membuat metode penggantian umum:Cek demo online di sini .
sumber
Maaf untuk mengalahkan kuda mati, tapi agak aneh bahwa tidak ada yang menunjukkan ini - "Ya Anda bisa, tapi ini kebalikan dari bagaimana Anda menggunakan grup penangkap dalam kehidupan nyata".
Jika Anda menggunakan Regex seperti seharusnya, solusinya sesederhana ini:
Atau seperti yang ditunjukkan oleh symosel di bawah ini,
... karena di regex Anda tidak ada alasan yang baik untuk mengelompokkan desimal sama sekali.
Anda biasanya tidak menggunakan grup penangkap pada bagian string yang ingin Anda buang , Anda menggunakannya pada bagian string yang ingin Anda pertahankan .
Jika Anda benar-benar menginginkan grup yang ingin Anda ganti, yang mungkin Anda inginkan adalah mesin templat (mis. Kumis, ejs, StringTemplate, ...).
Sebagai tambahan bagi yang penasaran, bahkan grup non-capturing dalam regex hanya ada untuk kasus di mana mesin regex membutuhkan mereka untuk mengenali dan melewati teks variabel. Misalnya, dalam
Anda memerlukannya jika masukan Anda dapat berupa " abcabc capture me bcdbcd" atau "abc capture me bcd" atau bahkan "capture me".
Atau dengan kata lain: jika teksnya selalu sama, dan Anda tidak menangkapnya, tidak ada alasan untuk menggunakan grup sama sekali.
sumber
\d(.*)\d
sudah cukup.$11
sini. Mengapa 11?Tambahkan grup ketiga dengan menambahkan tanda kurung di sekitarnya
.*
, lalu ganti urutannya dengan"number" + m.group(2) + "1"
. misalnya:sumber
"number$21"
bekerja dan"number" + m.group(2) + "1"
tidak.number$21
akan menggantikan grup 21, bukan grup 2 + string "1".Anda bisa menggunakan metode matcher.start () dan matcher.end () untuk mendapatkan posisi grup. Jadi dengan menggunakan posisi ini Anda dapat dengan mudah mengganti teks apa pun.
sumber
ganti bidang kata sandi dari input:
sumber
Berikut adalah solusi berbeda, yang juga memungkinkan penggantian satu grup dalam beberapa pertandingan. Ini menggunakan tumpukan untuk membalikkan urutan eksekusi, sehingga operasi string dapat dijalankan dengan aman.
sumber