Jawaban:
Anda bisa menggunakan pernyataan harapan di masa depan:
(?!999)\d{3}
Contoh ini cocok dengan tiga digit selain 999
.
Tetapi jika Anda tidak memiliki implementasi ekspresi reguler dengan fitur ini (lihat Perbandingan Rasa Ekspresi Reguler ), Anda mungkin harus membuat ekspresi reguler dengan fitur dasar sendiri.
Ekspresi reguler yang kompatibel hanya dengan sintaks dasar adalah:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
Ini juga cocok dengan urutan tiga digit yang tidak 999
.
Jika Anda ingin mencocokkan kata A dalam string dan tidak cocok dengan kata B. Misalnya: Jika Anda memiliki teks:
1. I have a two pets - dog and a cat
2. I have a pet - dog
Jika Anda ingin mencari baris teks yang MEMILIKI anjing untuk hewan peliharaan dan TIDAK kucing, Anda dapat menggunakan ekspresi reguler ini:
^(?=.*?\bdog\b)((?!cat).)*$
Ini hanya akan menemukan baris kedua:
2. I have a pet - dog
findstr
perintah DOS . Itu hanya memberikan sebagian kecil dari kemampuan yang Anda harapkan untuk ditemukan di alat regex; lookahead tidak ada di antara mereka. (Saya baru saja menambahkan tag findstr sendiri.)
Cocokkan dengan pola dan gunakan bahasa host untuk membalikkan hasil boolean dari pertandingan. Ini akan jauh lebih mudah dibaca dan dipelihara.
tidak, menghidupkan kembali pertanyaan kuno ini karena ada solusi sederhana yang tidak disebutkan. (Temukan pertanyaan Anda saat melakukan riset untuk pencarian karunia regex .)
Saya dihadapkan pada situasi di mana saya harus mencocokkan pola (A dan ~ B).
Regex dasar untuk ini sangat sederhana: B|(A)
Anda mengabaikan pertandingan keseluruhan dan memeriksa tangkapan Grup 1, yang akan berisi A.
Contoh (dengan semua penafian tentang parsing html di regex): A adalah digit, B adalah digit di dalam <a tag
Regex: <a.*?<\/a>|(\d+)
Demo (lihat Grup 1 di panel kanan bawah)
Referensi
\d
dengan [[:digit:]]
. Referensi pertama menyebutkan itu khusus untuk Perl dan PHP: "Ada variasi menggunakan sintaks khusus untuk Perl dan PHP yang mencapai hal yang sama."
Pelengkap bahasa biasa juga merupakan bahasa biasa, tetapi untuk mengkonstruksinya Anda harus membuat DFA untuk bahasa biasa, dan membuat perubahan status yang valid menjadi kesalahan. Lihat ini sebagai contoh. Apa halaman tidak katakan adalah bahwa itu dikonversi /(ac|bd)/
menjadi /(a[^c]?|b[^d]?|[^ab])/
. Konversi dari DFA kembali ke ekspresi reguler tidak sepele. Lebih mudah jika Anda dapat menggunakan ekspresi reguler tidak berubah dan mengubah semantik dalam kode, seperti yang disarankan sebelumnya.
replace
str.replace(/re/g, '')
, maka tidak perlu bergabung kembali dengan mereka. juga jika Anda melempar trailing yang bagus? seperti str.replace(/\re\s?/g, '')
kemudian Anda menyingkirkan duplikat spasi yang Anda miliki dari sesuatu yang diganti di tengah-tengah string
Jawaban saya di sini mungkin bisa menyelesaikan masalah Anda juga:
https://stackoverflow.com/a/27967674/543814
$1
, Anda akan membaca grup $2
.$2
dibuat tidak menangkap di sana, yang akan Anda hindari.Contoh:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
Grup penangkapan pertama menentukan pola yang ingin Anda hindari. Grup menangkap terakhir menangkap yang lainnya. Cukup baca grup itu $2
,.
findstr
tag karena semua jawaban di sini tidak valid untuk tag.