Pola regex saya terlihat seperti
<xxxx location="file path/level1/level2" xxxx some="xxx">
Saya hanya tertarik pada bagian dalam kutipan yang diberikan ke lokasi. Bukankah semudah di bawah ini tanpa saklar serakah?
/.*location="(.*)".*/
Sepertinya tidak berfungsi.
Jawaban:
Anda perlu membuat ekspresi reguler Anda menjadi tidak rakus, karena secara default,
"(.*)"
akan cocok dengan semuanya"file path/level1/level2" xxx some="xxx"
.Sebagai gantinya, Anda dapat membuat dot-star Anda tidak serakah, yang akan membuatnya sesedikit mungkin dengan karakter:
Menambahkan
?
pada quantifier (?
,*
atau+
) membuatnya tidak serakah.sumber
.*?
itu.\{-}
untuk pertandingan non-serakah.location="(.*)"
akan cocok dari "setelahlocation=
sampai" setelahsome="xxx
kecuali Anda membuatnya tidak serakah. Jadi Anda baik kebutuhan.*?
(yaitu membuatnya non-serakah) atau lebih baik ganti.*
dengan[^"]*
.sumber
.*?
notasinya lebih umum daripada[^"]*
Bagaimana tentang
Ini menghindari pencarian tanpa batas dengan. * Dan akan sama persis dengan kutipan pertama.
sumber
Gunakan pencocokan non-serakah, jika mesin Anda mendukungnya. Tambahkan ? di dalam tangkapan.
sumber
Penggunaan quantifier Malas
?
tanpa bendera global adalah jawabannya.Misalnya,
Jika Anda memiliki bendera global
/g
, itu akan cocok dengan semua pertandingan dengan panjang terendah seperti di bawah ini.sumber
Karena Anda menggunakan subpattern yang dikuantifikasi dan sebagaimana dijelaskan dalam Perl Doc ,
Jadi, untuk memungkinkan pola terkuantifikasi Anda membuat kecocokan minimum, ikuti dengan
?
:sumber
Ini cara lain.
Inilah yang Anda inginkan. Ini malas
[\s\S]*?
Item pertama:
[\s\S]*?(?:location="[^"]*")[\s\S]*
Ganti dengan:$1
Penjelasan : https://regex101.com/r/ZcqcUm/2
Untuk kelengkapan, ini yang terakhir. Ini serakah
[\s\S]*
Item terakhir:
[\s\S]*(?:location="([^"]*)")[\s\S]*
Ganti dengan:$1
Penjelasan : https://regex101.com/r/LXSPDp/3
Hanya ada 1 perbedaan antara dua ekspresi reguler ini dan itu adalah
?
sumber