Saya punya daftar string. Beberapa dari mereka memiliki bentuk 123-...456
. Bagian variabel "..." mungkin:
- string "apel" diikuti dengan tanda hubung, misalnya
123-apple-456
- string "pisang" diikuti oleh tanda hubung, misalnya
123-banana-456
- string kosong, misalnya
123-456
(perhatikan hanya ada satu tanda hubung)
Kata apa pun selain "apel" atau "pisang" tidak valid.
Untuk tiga kasus ini, saya ingin mencocokkan masing-masing "apel", "pisang", dan "". Perhatikan bahwa saya tidak pernah ingin menangkap tanda hubung, tetapi saya selalu ingin mencocokkannya . Jika string bukan dari bentuk 123-...456
seperti dijelaskan di atas, maka tidak ada kecocokan sama sekali.
Bagaimana cara menulis ekspresi reguler untuk melakukan ini? Anggaplah saya memiliki citarasa yang memungkinkan kelompok yang melihat ke depan, melihat ke belakang, mencari di sekitar, dan tidak menangkap.
Pengamatan utama di sini adalah bahwa ketika Anda memiliki "apel" atau "pisang", Anda juga harus memiliki tanda hubung tambahan, tetapi Anda tidak ingin mencocokkannya. Dan saat Anda mencocokkan string kosong, Anda tidak harus memiliki tanda hubung tambahan. Regex yang merangkum pernyataan ini akan menjadi yang benar, saya pikir.
Jawaban:
Satu-satunya cara untuk tidak menangkap sesuatu adalah menggunakan pernyataan melihat-lihat :
Karena bahkan dengan grup yang tidak menangkap
(?:…)
seluruh ekspresi reguler menangkap konten mereka yang cocok. Tetapi ungkapan reguler ini hanya cocokapple
ataubanana
jika itu didahului oleh123-
dan diikuti oleh-456
, atau cocok dengan string kosong jika diawali123-
dan diikuti oleh456
.sumber
Pembaruan: Terima kasih kepada Germán Rodríguez Herrera!
Dalam javascript coba:
/123-(apple(?=-)|banana(?=-)|(?!-))-?456/
Ingat bahwa hasilnya ada di grup 1
Demo Debuggex
sumber
Mencoba:
Itu akan cocok
apple
,,banana
atau string kosong, dan mengikutinya akan ada 0 atau 1 tanda hubung. Saya salah karena tidak memiliki kebutuhan untuk menangkap kelompok. Saya konyol.sumber
Saya telah memodifikasi salah satu jawaban (oleh @ op1ekun):
Alasannya adalah bahwa jawaban dari @ op1ekun juga cocok
"123-apple456"
, tanpa tanda hubung setelah apel.sumber
Coba ini:
sumber
apple
ataubanana
atau "". Semua nilai lain tidak valid, seperti yang saya nyatakan.Variasi ekspresi oleh @Gumbo yang digunakan
\K
untuk mengatur ulang posisi pertandingan untuk mencegah dimasukkannya blok angka dalam pertandingan. Dapat digunakan dalam rasa regre PCRE.Cocok:
sumber
Sejauh ini yang paling sederhana (berfungsi untuk python) adalah
'123-(apple|banana)-?456'
.sumber
123-apple456
sehingga tidak benar.