Saya telah menemukan posting yang sangat mirip, tetapi saya tidak bisa mendapatkan ekspresi reguler saya di sini.
Saya mencoba untuk menulis ekspresi reguler yang mengembalikan string yang berada di antara dua string lainnya. Sebagai contoh: Saya ingin mendapatkan string yang berada di antara string "sapi" dan "susu".
Sapi saya selalu memberi susu
akan kembali
"selalu memberi"
Inilah ungkapan yang telah saya kumpulkan bersama sejauh ini:
(?=cow).*(?=milk)
Namun, ini mengembalikan string "sapi selalu memberi".
javascript
regex
string
phil
sumber
sumber
Jawaban:
Seorang lookahead (
(?=
bagian itu) tidak mengkonsumsi input apa pun. Ini adalah pernyataan nol-lebar (seperti halnya pemeriksaan batas dan lihat di belakang).Anda ingin pasangan reguler di sini, untuk mengkonsumsi
cow
porsinya. Untuk menangkap bagian di antaranya, Anda menggunakan grup penangkap (cukup masukkan bagian pola yang ingin Anda tangkap di dalam tanda kurung):Tidak ada lookaheads yang diperlukan sama sekali.
sumber
matched[1]
, bukan keseluruhan teks yang cocok denganmatched[0]
.([\s\S]*?)
daripada(.*?)
.Solusi paling lengkap yang akan bekerja di sebagian besar kasus adalah menggunakan grup penangkap dengan pola pencocokan titik malas . Namun, sebuah titik
.
dalam regex JavaScript tidak cocok dengan karakter pemisah baris, jadi, apa yang akan berfungsi dalam 100% kasus adalah konstruksi[^]
atau[\s\S]
/[\d\D]
/[\w\W]
.ECMAScript 2018 dan solusi kompatibel yang lebih baru
Dalam lingkungan JavaScript yang mendukung ECMAScript 2018 ,
s
pengubah memungkinkan.
untuk mencocokkan karakter apa pun termasuk karakter line break, dan mesin regex mendukung tampilan di balik panjang variabel. Jadi, Anda bisa menggunakan regex likeDalam kedua kasus, posisi saat ini diperiksa
cow
dengan spasi putih 1/0 atau lebih setelahnyacow
, maka 0+ karakter sesedikit mungkin dicocokkan dan dikonsumsi (= ditambahkan ke nilai pertandingan), dan kemudianmilk
diperiksa untuk (dengan 1/0 atau lebih spasi putih sebelum substring ini).Skenario 1: Input satu baris
Ini dan semua skenario lainnya di bawah ini didukung oleh semua lingkungan JavaScript. Lihat contoh penggunaan di bagian bawah jawaban.
cow
ditemukan pertama, lalu spasi, lalu 0+ karakter apa pun selain karakter baris, sesedikit mungkin*?
kuantifier malas, dimasukkan ke Grup 1 dan kemudian spasi denganmilk
harus mengikuti (dan yang dicocokkan dan dikonsumsi , juga ).Skenario 2: Input multiline
Di sini,
cow
dan spasi dicocokkan terlebih dahulu, maka 0+ karakter apa pun yang sesedikit mungkin dicocokkan dan ditangkap ke dalam Grup 1, dan kemudian spasi denganmilk
dicocokkan.Skenario 3: Pertandingan yang tumpang tindih
Jika Anda memiliki string seperti
>>>15 text>>>67 text2>>>
dan Anda perlu mendapatkan 2 kecocokan di antara>>>
+number
+whitespace
dan>>>
, Anda tidak dapat menggunakan/>>>\d+\s(.*?)>>>/g
karena ini hanya akan menemukan 1 kecocokan karena fakta>>>
sebelumnya67
sudah dikonsumsi saat menemukan kecocokan pertama. Anda dapat menggunakan lookahead positif untuk memeriksa keberadaan teks tanpa benar-benar "melahapnya" (yaitu menambahkan kecocokan):Lihat menghasilkan demo regex online
text1
dantext2
sebagai konten Grup 1 ditemukan.Lihat juga Cara mendapatkan semua kecocokan yang mungkin tumpang tindih untuk sebuah string .
Pertimbangan kinerja
Pola pencocokan titik malas (
.*?
) di dalam pola regex dapat memperlambat eksekusi skrip jika input yang sangat panjang diberikan. Dalam banyak kasus, teknik membuka gulungan-the-loop membantu untuk tingkat yang lebih besar. Mencoba mengambil semua antaracow
danmilk
dari"Their\ncow\ngives\nmore\nmilk"
, kita melihat bahwa kita hanya perlu mencocokkan semua baris yang tidak dimulai denganmilk
, jadi, alih-alihcow\n([\s\S]*?)\nmilk
kita dapat menggunakan:Lihat demo regex (jika ada
\r\n
, gunakan/cow\r?\n(.*(?:\r?\n(?!milk$).*)*)\r?\nmilk/gm
). Dengan string uji kecil ini, peningkatan kinerja dapat diabaikan, tetapi dengan teks yang sangat besar, Anda akan merasakan perbedaannya (terutama jika garisnya panjang dan garis putus tidak terlalu banyak).sumber
Berikut adalah regex yang akan mengambil apa yang ada di antara sapi dan susu (tanpa spasi di depan / belakang):
Contoh: http://jsfiddle.net/entropo/tkP74/
sumber
.*
.*
nongreedyBenar-benar tidak perlu untuk lookahead.
sumber
Jawaban yang dipilih tidak berhasil untuk saya ... hmm ...
Tambahkan saja ruang setelah sapi dan / atau sebelum ASI untuk mengurangi ruang dari "selalu memberi"
sumber
?<=
tidak didukung dalam Javascript.Saya bisa mendapatkan apa yang saya butuhkan menggunakan solusi Martinho Fernandes di bawah ini. Kode tersebut adalah:
Anda akan melihat bahwa saya memberi tahu variabel testRE sebagai sebuah array. Ini karena testRE kembali sebagai array, untuk beberapa alasan. Output dari:
Perubahan menjadi:
sumber
Cukup gunakan ekspresi reguler berikut:
sumber
?<=
tidak didukung dalam Javascript. Akan menjadi cara untuk melakukannya.Saya menemukan regex menjadi membosankan dan memakan waktu mengingat sintaksis. Karena Anda sudah menggunakan javascript, lebih mudah melakukan hal berikut tanpa regex:
sumber
Jika data ada di beberapa baris maka Anda mungkin harus menggunakan yang berikut,
Contoh Regex 101
sumber
Pencocokan metode () mencari string untuk kecocokan dan mengembalikan objek Array.
sumber
Tugas
Ekstrak substring di antara dua string (tidak termasuk dua string ini)
Larutan
sumber