Ambil ekspresi reguler ini: /^[^abc]/
. Ini akan cocok dengan karakter tunggal apa pun di awal string, kecuali a, b, atau c.
Jika Anda menambahkan *
setelahnya - /^[^abc]*/
- ekspresi reguler akan terus menambahkan setiap karakter berikutnya ke hasilnya, hingga memenuhi salah satu a
, atau b
, atau c
.
Misalnya, dengan string sumber "qwerty qwerty whatever abc hello"
, ekspresi akan cocok dengan "qwerty qwerty wh"
.
Tetapi bagaimana jika saya ingin string yang cocok menjadi "qwerty qwerty whatever "
... Dengan kata lain, bagaimana saya bisa mencocokkan semuanya hingga (tetapi tidak termasuk) urutan yang tepat "abc"
?
match but not including
?"qwerty qwerty whatever "
- tidak termasuk "abc". Dengan kata lain, saya tidak ingin pertandingan yang dihasilkan terjadi"qwerty qwerty whatever abc"
.do string.split('abc')[0]
. Tentu bukan jawaban resmi untuk masalah ini, tapi saya merasa lebih mudah daripada regex.Jawaban:
Anda tidak menentukan rasa regex mana yang Anda gunakan, tetapi ini akan bekerja pada salah satu yang paling populer yang dapat dianggap "lengkap".
Bagaimana itu bekerja
Bagian
.+?
ini adalah versi tidak serakah dari.+
(satu atau lebih dari apa pun). Saat kami gunakan.+
, mesin pada dasarnya akan cocok dengan semuanya. Kemudian, jika ada sesuatu yang lain di regex itu akan kembali dalam langkah-langkah yang mencoba mencocokkan bagian berikut. Ini adalah perilaku serakah , yang berarti sebanyak mungkin memuaskan .Saat menggunakan
.+?
, alih-alih mencocokkan semuanya sekaligus dan kembali ke kondisi lain (jika ada), mesin akan mencocokkan karakter berikutnya secara bertahap hingga bagian regex berikutnya dicocokkan (lagi jika ada). Ini adalah yang serakah , artinya cocok dengan sesedikit mungkin untuk memuaskan .Setelah itu kita miliki , pernyataan nol lebar , melihat-lihat . Konstruksi yang dikelompokkan ini cocok dengan isinya, tetapi tidak dihitung sebagai karakter yang cocok ( lebar nol ). Itu hanya kembali jika itu cocok atau tidak ( pernyataan ).
(?=
{contents}
)
Dengan demikian, dalam istilah lain, regex
/.+?(?=abc)/
berarti:sumber
.+?
dan.*
?+
berarti 1 atau lebih, di mana*
berarti 0 atau lebih. Dimasukkan / dikecualikannya?
akan membuatnya serakah atau tidak serakah.^(?:(?!abc)(?!def).)*
Anda dapat rantai untuk mengecualikan pola yang tidak Anda inginkan dan itu akan tetap mengambil semua yang diperlukan bahkan jika pola itu tidak adaJika Anda ingin menangkap semuanya hingga "abc":
Penjelasan:
( )
menangkap ekspresi dalam kurung untuk akses menggunakan$1
,$2
, dll^
cocokkan mulai dari garis.*
cocok dengan apa pun,?
tidak rakus (cocok dengan jumlah minimum karakter yang diperlukan) - [1][1] Alasan mengapa ini diperlukan adalah bahwa jika tidak, dalam string berikut:
secara default, regex serakah , artinya akan serasi sebanyak mungkin. Oleh karena itu
/^.*abc/
akan cocok dengan "apa pun apa pun sesuatu sesuatu". Menambahkan quantifier yang tidak rakus?
membuat regex hanya cocok dengan "apa pun apa pun sesuatu".sumber
sed
tampaknya tidak mendukung pencocokan non-serakah, juga tidak mendukung look-around ((?=...)
). Apa lagi yang bisa saya lakukan? Contoh perintah:echo "ONE: two,three, FOUR FIVE, six,seven" | sed -n -r "s/^ONE: (.+?), .*/\1/p"
kembalitwo,three, FOUR FIVE
, tapi saya harapkantwo,three
...two
, bukantwo,three
.Seperti yang ditunjukkan oleh Jared Ng dan @Issun, kunci untuk menyelesaikan RegEx seperti "mencocokkan semuanya dengan kata atau substring tertentu" atau "mencocokkan semuanya setelah kata atau substring tertentu" disebut "lookaround" pernyataan panjang nol . Baca lebih banyak tentang mereka disini.
Dalam kasus khusus Anda, itu dapat diselesaikan dengan pandangan positif ke depan:
.+?(?=abc)
Sebuah gambar bernilai ribuan kata. Lihat penjelasan detail di tangkapan layar.
sumber
.+?(?=abc)
copy-pastable regex lebih berharga.Yang Anda butuhkan adalah melihat-lihat seperti pernyataan
.+? (?=abc)
.Lihat: Lookahead dan Lookbehind Zero-Length Assertions
Sadarilah bahwa
[abc]
tidak sama denganabc
. Di dalam kurung itu bukan string - setiap karakter hanyalah salah satu dari kemungkinan. Di luar kurung itu menjadi tali.sumber
Untuk regex di Jawa, dan saya percaya juga pada sebagian besar mesin regex, jika Anda ingin memasukkan bagian terakhir ini akan berfungsi:
Misalnya, di baris ini:
pilih semua karakter hingga "abc" dan sertakan juga abc
menggunakan regex kami, hasilnya adalah:
I have this very nice senabc
Uji ini: https://regex101.com/r/mX51ru/1
sumber
Saya mengakhiri pertanyaan stackoverflow ini setelah mencari bantuan untuk menyelesaikan masalah saya tetapi tidak menemukan solusi untuk itu :(
Jadi saya harus berimprovisasi ... setelah beberapa waktu saya berhasil mencapai regex yang saya butuhkan:
Seperti yang Anda lihat, saya memerlukan satu folder di depan folder "grp-bps", tanpa menyertakan tanda hubung terakhir. Dan itu diperlukan untuk memiliki setidaknya satu folder setelah folder "grp-bps".
Edit
Versi teks untuk salin-rekat (ubah 'grp-bps' untuk teks Anda):
sumber
Ini masuk akal tentang regex.
Di sini, kita bisa mendapatkan kata yang tepat secara global yang termasuk dalam tanda kutip ganda. Sebagai Contoh, Jika teks pencarian kami adalah,
Ini adalah contoh untuk kata-kata "dikutip ganda"
maka kita akan mendapatkan "double quote" dari kalimat itu.
sumber
"
, yang bagi saya tampaknya tidak relevan untuk pertanyaan itu.Dengan python:
.+?(?=abc)
bekerja untuk kasing tunggal.[^]+?(?=abc)
tidak berfungsi, karena python tidak mengenali [^] sebagai regex yang valid. Agar pencocokan multiline berfungsi, Anda harus menggunakan opsi re.DOTALL, misalnya:sumber
Saya yakin Anda membutuhkan subekspresi. Jika saya ingat benar, Anda dapat menggunakan
()
tanda kurung normal untuk subekspresi.Bagian ini adalah Dari grep manual:
Lakukan sesuatu seperti
^[^(abc)]
seharusnya melakukan trik.sumber
Ini
$
menandai akhir dari sebuah string, jadi sesuatu seperti ini harus berfungsi: di[[^abc]*]$
mana Anda mencari sesuatu yang TIDAK AKAN BERAKHIR dalam iterasi apa punabc
, tetapi itu harus berada di akhirJuga jika Anda menggunakan bahasa skrip dengan regex (seperti php atau js), mereka memiliki fungsi pencarian yang berhenti ketika pertama kali menemukan suatu pola (dan Anda dapat menentukan mulai dari kiri atau mulai dari kanan, atau dengan php, Anda dapat melakukan implode untuk mencerminkan string).
sumber
coba ini
Pertanyaan:
keluaran:
sumber